与使用 GCC 3.4.6 (libstdc++.so.6.0.13) 生成的 gmock 库链接会产生"undefined reference to... @GLIBCXX_3.4.9"错误

Linking with gmock libs generated using GCC 3.4.6 (libstdc++.so.6.0.13) gives "undefined reference to... @GLIBCXX_3.4.9" errors

本文关键字:链接 undefined @GLIBCXX 错误 to reference libstdc++ GCC so gmock      更新时间:2023-10-16

使用在Linux机器"a"上生成的gmock(1.4+svn281)库进行链接,GCC 3.4.6使用libstdc++.so.6.0.13会出现以下链接错误:

libgmock.so:对"std::basic_stream>&std::__ostream_insert>(std::basic_stream>&,char const*,long)@GLIBCXX_3.4.9'…

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

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

在libstdc++.so.6.0.13上对GLIBCXX_3.4.9进行Grepping显示它包含这样的符号模式:_ZNSt13basic_streamIwSt1@@GLIBCXX_3.4.9(参考GLIBCXX_3.4.9,因此出现错误)。我验证了libstdc++.so.6.0.3的情况并非如此

  • 为了理解链接错误以及我的选择,我阅读了关于libstdc++和glibcxx的文章,以获得一些观点,但无法得出libs之间的关系:libstdcC++需要glibcxx吗?还是相反(错误消息让人觉得问题是:在glibcxx中,对libstdc+中的符号有一个未定义的引用)
  • libstdc++是否隐式地与glibcxx链接(知道libstdc++可以一次引用多个glibcxx版本)
  • 每当我想更新libs时,我不想回到旧机器上构建gmock,我是否被限制为使用特定的libstdc++版本来构建gmock

感谢有关问题的任何帮助

编辑:

我在机器"A"上构建了gmock-libs,并指定了libstdc++的版本:libstdc++.so.6.0.3,得到了与以前相同的错误,但这次没有在符号末尾添加@GLIBCXX_3.4.9:

libgmock.so:对"std::basic_stream>&std::__ostream_insert>(std::basic_stream>&,char const*,long)'…

我还通过启动命令"readelf-a libgmock.so"并验证GLIBCXX_3.4.9没有被引用,验证了libstdc++.so.6.0.3是否被实际使用。

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

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

您的实际问题和可能的解决方案在这里进行了解释。

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

相关文章: