Recently I switched to gcc-6 in my OS X, and faced to VARIOUS of disasterS. One of them is the gcc compile cannot find header "stdlib.h"

For detail, we can find error message as follow:

In file included from /usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/ext/string_conversions.h:41:0,
                 from /usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/bits/basic_string.h:5402,
                 from /usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/string:52,
                 from /Users/yu/.local/src/xgboost/dmlc-core/include/dmlc/base.h:171,
                 from /Users/yu/.local/src/xgboost/dmlc-core/src/recordio.cc:3:
/usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0/cstdlib:75:25: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
                         ^
compilation terminated.

Thousands of similar questions can be found in google and most of them are stupid s**t. After hours' check, this follow up gives me the answer.

Afaik new GCC 6 trips if you manually pass /usr/include in the wrong order. What happens if you remove that obvious CPLUS_INCLUDE_PATH, and check the makefile/configure script for any -I /usr/include and subsequently remove them? Not on my arch would test that myself otherwise.

This problem is from my environment settings. At first, my environment parameter CPLUS_INCLUDE_PATH written as follow:

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include:/usr/local/include:$HOME/.local/include:/some/other/paths

This sequence is incorrect, because we can find stdlib.h in /usr/include , but that stdlib.h is not expected by gcc-6, and an fatal error comes.

To fix this problem, a fix may as follow:

export CPLUS_INCLUDE_PATH=/usr/local/Cellar/gcc/6.2.0/include/c++/6.2.0:/usr/include:/usr/local/include:$HOME/.local/include:$CPLUS_INCLUDE_PATH

And finally, it works.

PS:

How to install gcc-6 in OS X?

We shall install homebrew first, and then type:

brew install gcc --without-multilib

brew is the de facto standard of yum/dnf/apt-get on OS X. You can use parameter "--without-multilib" to obtain the support OpenMP, and it will take you quite a while (~30 min) to compile the whole gcc. You can check here and here for more details.

How to change default C/C++ compile?

You can edit your ~/.bash_profile or ~/.bashrc, create one if not exists, and then append lines as follow:

CC=/usr/local/bin/gcc-6
CXX=/usr/local/bin/g++-6

Your cmake or most of other makefiles will detect these environment parameters and use them as default C/C++ compile

Categories: Code

Yu

Ideals are like the stars: we never reach them, but like the mariners of the sea, we chart our course by them.

Leave a Reply

Your email address will not be published. Required fields are marked *