Ubuntu 16下自定义编译GCC 4.6.3/5.4.0头文件路径差异及依赖缺失问题
解决Ubuntu 16编译GCC 4.6.3后找不到sys/cdefs.h的问题
我之前在Ubuntu 16上编译过GCC 4.6.3,也碰到过一模一样的问题——旧版GCC在较新的系统上编译完成后,默认的头文件搜索路径会漏掉它自身的内部include目录,而sys/cdefs.h正好就位于这个目录里。给你几个可行的解决步骤:
1. 重新用正确的参数配置GCC编译(推荐)
旧版GCC的configure参数在新系统上需要明确指定系统根目录和头文件路径,不然会导致安装后的GCC无法识别自身的内部头文件。建议采用out-of-tree编译(单独创建build目录,避免污染源码):
首先创建并进入build目录:
mkdir gcc-4.6.3-build && cd gcc-4.6.3-build运行configure命令,指定安装路径和关键参数:
../gcc-4.6.3/configure --prefix=/usr/local/gcc-4.6.3 \ --enable-languages=c,c++ \ --with-sysroot=/ \ --with-native-system-header-dir=/usr/include各参数说明:
--prefix:指定GCC的安装位置,方便后续管理--enable-languages:只编译需要的语言(这里选c和c++,减少编译时间)--with-sysroot=/:绑定系统根目录,让GCC能找到系统级头文件--with-native-system-header-dir=/usr/include:明确指定系统头文件目录,避免GCC混淆路径
编译并安装:
make -j$(nproc) && sudo make install
2. 验证头文件搜索路径
安装完成后,运行以下命令检查GCC的头文件搜索列表:
/usr/local/gcc-4.6.3/bin/gcc -xc -E -v - < /dev/null
如果配置正确,你应该能看到类似/usr/local/gcc-4.6.3/lib/gcc/x86_64-linux-gnu/4.6.3/include的路径出现在搜索列表里——这就是sys/cdefs.h所在的位置。
3. 临时补救:手动指定头文件路径
如果暂时不想重新编译,可以在使用该GCC编译代码时,通过-I参数手动添加缺失的路径:
/usr/local/gcc-4.6.3/bin/gcc -I/usr/local/gcc-4.6.3/lib/gcc/x86_64-linux-gnu/4.6.3/include your_source.c -o your_program
或者设置环境变量,让GCC默认搜索该路径:
export C_INCLUDE_PATH=/usr/local/gcc-4.6.3/lib/gcc/x86_64-linux-gnu/4.6.3/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/usr/local/gcc-4.6.3/lib/gcc/x86_64-linux-gnu/4.6.3/include:$CPLUS_INCLUDE_PATH
额外提示
Ubuntu 16的系统头文件版本相对较新,和GCC 4.6.3可能存在一些兼容性小问题。如果后续碰到其他头文件相关错误,可以尝试安装libc6-dev的兼容版本,但大部分情况下,只要GCC自身的路径配置正确,sys/cdefs.h的问题就能解决。
内容的提问来源于stack exchange,提问作者mami




