我已按照说明从源代码构建GCC。我为configure
做的唯一修改是:
-5.4
的二进制后缀,以便我可以将编译器用作g++-5.4
。--configure-multilib
因为它不会以其他方式运行。我通过使用各种不同的编译器来编译它来测试我的一些代码。在这个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共享库,所以其他东西是不对的。
答案 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
之前添加该路径才能加载该程序。