如何使用GCC 4.8配置libstdc++?

9
前段时间,我决定升级到 GCC 4.8 版本以获取一些 C++11 的新特性。但是我被一些事情分心了,一直没有使用任何新特性,直到几天前开始一个新项目(虽然新的编译器似乎一直工作得很好,但这可能只是因为我没有使用任何新功能)。在这个新项目中,当我使用 =std=c++11 标志编译时没有问题。但是,在运行时,我遇到了错误:"./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by ./main)"。我认为这是与 GCC 4.8 相关的较新的 libstdc++ 库链接出现了问题,但我无法解决此问题,也不知道适当的库在哪里。我记得将 g++ 和 gcc 二进制文件符号链接到了 gcc-4.8,看起来它们工作正常,因为 `g++ -v` 返回了以下信息: "Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/app/gcc/4.8.0/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ./gcc-4.8.0/configure --prefix=/app/gcc/4.8.0 Thread model: posix gcc version 4.8.0 (GCC)". 在线上的另一个线程让我查看程序的ldd输出,它确实向我显示了正在链接的libstdc++库的文件夹结构与二进制文件的文件夹结构不同。但是,我无法在后者中找到适当的libstdc++库,因此我不知道该去哪里寻找。`ldd main` 的输出如下:"./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by ./main) linux-gate.so.1 => (0xb7791000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb768e000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7662000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7644000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb749b000) /lib/ld-linux.so.2 (0xb7792000)"。

我不确定问题出在哪里,我将继续谷歌搜索和寻找答案,但如果你们能提供任何帮助,将不胜感激。如果问题不清楚或者我忘记了一些信息,请告诉我,我会尽力添加进去。非常感谢!


可能是链接g++ 4.8到libstdc++的重复问题。 - Jonathan Wakely
1个回答

13
您需要告诉动态链接器(在运行程序时执行)库的位置。将LD_LIBRARY_PATH设置为库的路径(可能在/app/gcc/4.8.0/lib或其它某个地方下面)。
使用find /app/gcc/4.8.0 -name "libstdc++.so.6"命令查找该目录并将其添加到LD_LIBRARY_PATH中,例如: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/gcc/4.8.0/lib(如果您正在使用Linux上的Bourne类shell,则为默认配置)。
然后尝试运行您的程序。
如果可以正常工作,您可能希望配置动态链接器以在不使用LD_LIBRARY_PATH的情况下查找该目录。有关如何配置路径的详细信息,请参见man ld.so

完美,立即就能工作!我不确定为什么我没有想到去关联的lib目录查找,而是在/usr/lib里瞎搞...回想起来总是事后诸葛亮。无论如何,再次感谢,非常感谢您的帮助! - paul
@Guillaume 那么 ld.so 是如何工作的呢?你只需要在终端中运行 ld.so --library-path /app/gcc/4.8.0/lib,它就会像在 LD_LIBRARY_PATH 上一样神奇地被系统中的每个地方使用吗?如果是这样,那么为什么这比使用 LD_LIBRARY_PATH 更好呢? - David Doria
@DavidDoria ld.so --library-path blah 只是用该搜索路径调用链接器。这不会更改链接器的默认配置(至少在Linux上是这样)。如果想要更改其默认搜索路径,可能需要编辑/etc/ld.so.conf或类似的文件。 man ld.so 将为您提供所有详细信息。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接