从源头建立GCC 5.4;这样构建的可执行文件尝试链接不兼容的libstdc ++并且无法运行

时间:2016-11-08 22:17:17

标签: c++ linux c++11 gcc

我已按照说明从源代码构建GCC。我为configure做的唯一修改是:

  1. 使用-5.4的二进制后缀,以便我可以将编译器用作g++-5.4
  2. 设置--configure-multilib因为它不会以其他方式运行。
  3. 我通过使用各种不同的编译器来编译它来测试我的一些代码。在这个Centos 7系统上,我已经运行了系统gcc(4.8.2)以及clang(也是从源代码编译),现在我希望看到5.4工作。

    基于these instructions,在源代码中,我将这些语句放在一起使链接器满意。

    #define _GLIBCXX_USE_CXX11_ABI 0

    现在可执行文件编译链接,我在运行它时得到了这个...

    /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by <program name>)
    

    我无法在此告诉我,但我确实知道实际的符号链接/usr/lib64/libstdc++.so.6链接到较旧的符号链接/usr/lib64/libstdc++.so.6.0.19,以及作为GCC 5.4的一部分构建的符号链接/usr/local/lib64/libstdc++.so.6.0.21生活在其他地方(HashMap<Character, ArrayList<String>> letters = new HashMap<Character, ArrayList<String>>(); )。这表明我使用5.4构建的这个程序正在查看正确的(旧的)stdlib共享库,所以其他东西是不对的。

2 个答案:

答案 0 :(得分:3)

新编译器正在生成希望链接到较新的libstdc ++而不是系统的代码。链接器发现不满足此期望,因此会引发错误。

要解决此问题,您必须确保使用正确的路径来查找和链接libstdc ++。有几个选择:

  • 使用-rpath链接器选项。此选项添加了在动态链接期间要使用的目录的路径。由于它是一个链接器选项,因此在调用编译器时使用-Wl,<option>传递它,例如: g++ ... -Wl,-rpath=/usr/local/lib64 ...。您可能还需要使用-L选项添加路径。

  • 在运行时设置环境变量LD_LIBRARY_PATH

另请参阅:compiler-libstdc-version-vs-system-version

由于您使用的是Centos,因此您可能还需要查看devtoolset集合,该集合允许并行安装较新的GCC工具集。

答案 1 :(得分:1)

这表明我使用5.4构建的这个程序正在查看正确的(旧的)stdlib共享库

......据我所知,那是错误的图书馆,不是吗?因为程序是用新的g ++版本构建的,所以它应该使用新的libstdc ++,即/usr/local/lib64/libstdc++.so.6.0.21中的那个。

那么您可能需要在LD_LIBRARY_PATH之前添加该路径才能加载该程序。