与使用GCC 3.4.6(libstdc ++。so.6.0.13)生成的gmock库链接,给出了未定义的引用... @ GLIBCXX_3.4.9"错误

时间:2014-10-23 16:15:53

标签: c++ gcc glibc libstdc++ gmock

与Linux机器“A”上生成的gmock(1.4 + svn281)lib链接,使用 libstdc ++。so.6.0.13 获得GCC 3.4.6会给出以下链接错误:

libgmock.so:对`std :: basic_ostream>&的未定义引用std :: __ ostream_insert>(std :: basic_ostream>&,char const *,long) @GLIBCXX_3.4.9 ' ...

我也尝试了最新的gmock发行版本,并且还得到了未定义的引用... @ GLIBCXX_3.4.9错误(这次是其他符号)。

使用相同的构建过程构建gmock,但是在另一台机器“B”(现在退役的机器,但以前用于生成旧的二进制文件)我能够成功链接。该机器使用GCC 3.4.6,具有不同的libstdc ++版本: libstdc ++。so.6.0.3

grepping on libstdc ++。so.6.0.13 for GLIBCXX_3.4.9表明它包含这样的符号模式: _ZNSt13basic_ostreamIwSt1 @@ GLIBCXX_3.4.9(引用GLIBCXX_3.4.9,因此出错)。我验证了libstdc ++的情况并非如此.so.6.0.3

  • 为了理解链接错误以及我的选择,我阅读了libstdc ++和glibcxx以获得一些观点,但无法得出libs之间的关系:libstdc ++是否需要glibcxx或者是另一种方式(错误)消息使得看起来问题是:在glibcxx中,libstdc ++中有一个未定义的符号引用)?
  • libstdc ++是否隐式链接到glibcxx(知道libstdc ++一次可以引用多个glibcxx版本)?
  • 每当我想更新lib时,我都不想回到旧机器上构建gmock,我是否限制使用特定的libstdc ++版本构建gmock?

感谢对此问题的任何帮助

编辑:

我在机器“A”上构建了gmock库并指定了libstdc ++的版本:libstdc ++。so.6.0.3并且得到了与之前相同的错误,但这次没有在符号末尾附加@GLIBCXX_3.4.9 :

libgmock.so:对`std :: basic_ostream>&的未定义引用std :: __ ostream_insert>(std :: basic_ostream>&,char const *,long)' ...

我还通过启动命令:“readelf -a libgmock.so”并验证GLIBCXX_3.4.9未被引用来验证libstdc ++。so.6.0.3实际被采用。

1 个答案:

答案 0 :(得分:0)

  

为了理解链接错误以及我的选择,我阅读了libstdc ++和glibcxx以获得一些观点,但无法得出libs之间的关系:libstdc ++是否需要glibcxx

没有glibcxx库这样的东西。 libstdc++.so使用GNU符号版本控制,并使用GLIBCXX符号前缀。整个GLIBCXX是<{1}}本身的实施细节

解释了您的实际问题和可能的解决方案here

实际上,您不能指望在较新的Linux系统上链接的二进制文件可以在较旧的Linux系统上工作。