指定glibc 2.27头文件路径编译失败求助
嘿,我碰到过类似的情况——你这问题本质上是只换了glibc的头文件,但没让整个编译链跟上新glibc的节奏,导致新旧版本的glibc组件“打架”了。下面给你拆解原因和靠谱的解决办法:
为啥加了-I就报错?
当你用-I /FaF/glibc/include强制g用高版本glibc头文件时,编译链里的其他环节(比如系统默认的链接器ld、g自身依赖的库)还死死绑定着系统原生的glibc 2.22。高版本glibc的头文件里会有新的宏定义、函数声明,这些内容和旧版本glibc的实际实现完全不匹配,自然就炸出一堆编译错误——比如头文件声明了某个函数,但系统库根本没对应的实现,或者宏定义重复冲突。
正确的操作姿势
要完整用上你自己编译的glibc 2.27,不能只给头文件,得让编译、链接、运行整个流程都指向这个新环境:
编译链接一步到位,指定头+库+运行路径
别只加-I,还要用-L指定glibc的库目录,再用-Wl,--rpath告诉程序运行时去加载新glibc:g++ testAbs.cpp -o testAbs -I /FaF/glibc/include -L /FaF/glibc/lib -Wl,--rpath=/FaF/glibc/lib注意如果你的glibc是64位编译的,库目录可能是
/FaF/glibc/lib64,根据你实际安装的路径调整。确保g++本身依赖新glibc
如果你当初编译g7.3的时候用的是系统默认的glibc 2.22,那g自己的二进制还依赖旧版本,就算你编译程序时指定新glibc,也可能有隐性冲突。最好重新编译g++7.3,编译前先把环境变量指向新glibc:export LD_LIBRARY_PATH=/FaF/glibc/lib:$LD_LIBRARY_PATH export CFLAGS="-I /FaF/glibc/include -L /FaF/glibc/lib" export CXXFLAGS="-I /FaF/glibc/include -L /FaF/glibc/lib" # 然后重新执行g++7.3的编译安装步骤,输出目录还是/FaF杜绝头文件混合加载
要确保编译器优先用你指定的新头文件,把-I放在最前面,还可以加-nostdinc++强制不加载系统默认的C标准库头文件(如果你也编译了和g7.3配套的libstdc++,记得把它的头文件路径也加上):g++ testAbs.cpp -o testAbs -I /FaF/glibc/include -I /FaF/libstdc++/include -L /FaF/glibc/lib -L /FaF/libstdc++/lib -Wl,--rpath=/FaF/glibc/lib:/FaF/libstdc++/lib -nostdinc++
重要提醒
SLES 12.3的整个系统工具链都依赖glibc 2.22,绝对不要直接替换系统默认的glibc,不然系统分分钟崩给你看。用--rpath让你的程序单独加载新glibc是最安全的方式。如果要编译复杂项目,最好用chroot或者轻量容器隔离出一个独立的编译环境,彻底避免和系统环境的冲突。
内容的提问来源于stack exchange,提问作者Peter VARGA

