2016-11-08 12 views
0

我遵循了从源代码构建GCC的说明。我的configure所做的唯一修改为:从源码构建GCC 5.4;因此构建的可执行文件尝试链接不兼容的libstdC++并且无法运行

  1. 使用-5.4二进制后缀,这样我就可以使用编译器作为g++-5.4例如。
  2. 设置--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共享库,所以其他的东西是不对的。

+0

如果我是你,我只是使用Docker与一个普通的Ubuntu或Debian容器,你会得到这个编译器(以及gcc 6. *)“免费”。也就是说,有时候重建是一个很好的练习。只要知道你有选择... –

+2

gcc喜欢相信很多libstdC++会安装在默认位置。我不再记得详细信息,但需要梳理整个配置选项以指定非默认安装目录。可能需要对其使用的内部默认规格文件进行陪审,以使其看到正确的位置并向ld(-L和-R)提供正确的参数。 –

+0

所以btw。如果我理解的很好,你想使用新的编译器构建,但将可执行文件链接到使用旧的libstdC++?不知道这是否可能(你需要以某种方式提供旧的libstdC++的路径来链接...或者通过替换旧版本来篡改新编译器版本的libstdC++)。 – axalis

回答

3

新的编译器正在生成代码,它希望链接到新的libstdC++,而不是系统。链接器发现这个期望没有被满足,所以它会抛出一个错误。

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

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

    由于您使用的Centos,你可能还需要检查出devtoolset集合,它允许新的并行安装:在运行时

参见

  • 设置环境变量LD_LIBRARY_PATH GCC工具集。

  • +0

    太棒了,我99%确定你在这里碰到了头,我只是一旦我试着去测试这一点就会打勾。 –

    +0

    这很好,但现在有点混乱,因为我认为现在发生的事情是两个stdlib都与该构建有关,因为通过指定'rpath',它可以找到两个stdlib,因此不会再抱怨缺少更新的GLIBC。因此,我现在想知道的是如何强制新的gcc不需要新的东西并使用所有旧的东西。但是可能这样做并不合理或有用,因为在一天结束时,我希望使用一个特定的工具链构建整个系统,这个问题将是没有实际意义的。 –

    +0

    关于您的编辑。你使用devtoolset吗?看起来很整洁,但它会让我只安装这些工具的一部分(例如gcc)?其实没关系。答案可能是肯定的。 –

    1

    这表明这个节目,我用内置5.4寻找正确的(旧)STDLIB LIB共享

    ...就我所看到的,这是错误的图书馆,是不是它?由于该程序是使用新的g ++版本构建的,因此应该使用新的libstdC++,即/usr/local/lib64/libstdc++.so.6.0.21中的那个。

    那么你可能需要将该路径预先加入LD_LIBRARY_PATH才能加载程序。

    +0

    是的,但我明确地定义了'_GLIBCXX_USE_CXX11_ABI'来防止这种情况。 –

    +0

    好吧,也许它仍然链接新的libstdC++ ...尝试在LD_LIBRARY_PATH中添加新路径。如果这将起作用,则表示链接器正在链接新链接。 – axalis

    +0

    你知道这是有道理的,因为我唯一向编译器“传达”不使用它认为是“正确”的stdlib的地方是在我的代码中的#define中。这不是一个编译器标志。所以这很有意义。我想哈利已经到底了。 –

    相关问题