C++ 与使用GCC 3.4.6(libstdc+;+;.so.6.0.13)生成的gmock LIB链接,得到;对…的未定义引用@GLIBCXX“U 3.4.9”;错误

C++ 与使用GCC 3.4.6(libstdc+;+;.so.6.0.13)生成的gmock LIB链接,得到;对…的未定义引用@GLIBCXX“U 3.4.9”;错误,c++,gcc,glibc,libstdc++,gmock,C++,Gcc,Glibc,Libstdc++,Gmock,使用Linux机器“a”上生成的gmock(1.4+svn281)libs链接,GCC 3.4.6使用libstdc++.so.6.0.13会产生以下链接错误: libgmock.so:std::basic_ostream>和std:_ostream_insert>的未定义引用(std::basic_ostream>和char const*,long)@GLIBCXX_3.4.9' 我还尝试了最新的gmock发行版,还得到了未定义的引用@GLIBCXX_3.4.9错误(这次使用其他符号) 使用

使用Linux机器“a”上生成的gmock(1.4+svn281)libs链接,GCC 3.4.6使用libstdc++.so.6.0.13会产生以下链接错误:

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

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

  • 为了理解链接错误以及我的选项,我阅读了libstdc++和glibcxx的相关内容,以获得一些观点,但无法得出libs之间的关系:libstdc++需要glibcxx还是需要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_ostream>和std:u ostream_insert>(std::basic_ostream>和,char const*,long)的未定义引用

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

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

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

说明了您的实际问题和可能的解决方案


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

正如您提到的在较新的Linux系统上链接:我使用较新的g++构建gmock(我验证了gcc的版本,而我应该验证了g++)