指定编译器的libstdc++.so.6路径:GCC4.9编译C++包遇版本错误
这个问题我碰到过好多次了,核心是编译器/链接器没有优先使用你指定的GCC配套库,下面几个方法按优先级尝试:
1. 在链接时添加rpath参数(最推荐)
直接告诉链接器把你的新库路径写入可执行文件的运行时搜索路径,这样运行时会优先找这里的库。在你的Makefile里,找到LDFLAGS变量,添加如下参数:
LDFLAGS += -Wl,-rpath=/mypath/lib64
如果Makefile里没有LDFLAGS,就直接定义它。这个参数会让链接器在生成的可执行文件中记录/mypath/lib64作为优先搜索路径,彻底解决运行时库查找的问题。
2. 确保编译器本身使用配套的库
有时候即使你指定了CC/CXX,GCC可能还是会默认搜索系统库路径。你可以先检查你的GCC的搜索路径:
/mypath/bin/gcc -print-search-dirs
查看输出里的libraries:部分,确认/mypath/lib64是否在列表里。如果不在,设置GCC_EXEC_PREFIX环境变量(路径要对应你的GCC安装结构,比如4.9版本的gcc库路径通常是/mypath/lib/gcc/x86_64-linux-gnu/4.9/):
export GCC_EXEC_PREFIX=/mypath/lib/gcc/x86_64-linux-gnu/4.9/
设置后再重新编译,编译器会优先搜索自己配套的库目录。
3. 检查LD_LIBRARY_PATH的生效时机
你可能已经设置了LD_LIBRARY_PATH,但要确保它在编译前就已经生效:
- 如果是在终端里编译,先执行
export LD_LIBRARY_PATH=/mypath/lib64:$LD_LIBRARY_PATH,再运行make; - 如果是在Makefile里设置,要加上
export关键字,比如:export LD_LIBRARY_PATH := /mypath/lib64:$(LD_LIBRARY_PATH)
另外,有些系统会限制LD_LIBRARY_PATH对setuid程序的影响,但这里是编译自己的程序,应该没问题。
4. 检查Makefile是否硬编码了系统库路径
打开你的Makefile,看看有没有直接指定-L/usr/lib64的链接参数,如果有,把它替换成-L/mypath/lib64,或者直接删掉(因为rpath已经足够)。
验证是否生效
编译完成后,用ldd命令检查生成的可执行文件的库依赖:
ldd /local/p4clients/pkgbuild-S1NVe/workspace/build
找到libstdc++.so.6那一行,看看路径是不是/mypath/lib64/libstdc++.so.6,如果是就说明成功了。
内容的提问来源于stack exchange,提问作者Pavan Tiwari

