我遵循了从源代码构建GCC的说明。我的configure
所做的唯一修改为:从源码构建GCC 5.4;因此构建的可执行文件尝试链接不兼容的libstdC++并且无法运行
- 使用
-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
),并且作为GCC5.4的一部分构建的链接生活在其他地方(/usr/local/lib64/libstdc++.so.6.0.21
)。这将表明,我使用5.4构建的这个程序正在查看正确的(旧)stdlib共享库,所以其他的东西是不对的。
如果我是你,我只是使用Docker与一个普通的Ubuntu或Debian容器,你会得到这个编译器(以及gcc 6. *)“免费”。也就是说,有时候重建是一个很好的练习。只要知道你有选择... –
gcc喜欢相信很多libstdC++会安装在默认位置。我不再记得详细信息,但需要梳理整个配置选项以指定非默认安装目录。可能需要对其使用的内部默认规格文件进行陪审,以使其看到正确的位置并向ld(-L和-R)提供正确的参数。 –
所以btw。如果我理解的很好,你想使用新的编译器构建,但将可执行文件链接到使用旧的libstdC++?不知道这是否可能(你需要以某种方式提供旧的libstdC++的路径来链接...或者通过替换旧版本来篡改新编译器版本的libstdC++)。 – axalis