与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
感谢对此问题的任何帮助
编辑:
我在机器“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实际被采用。
答案 0 :(得分:0)
为了理解链接错误以及我的选择,我阅读了libstdc ++和glibcxx以获得一些观点,但无法得出libs之间的关系:libstdc ++是否需要glibcxx
没有glibcxx
库这样的东西。 libstdc++.so
使用GNU符号版本控制,并使用GLIBCXX
符号前缀。整个GLIBCXX
是<{1}}本身的实施细节。
解释了您的实际问题和可能的解决方案here。
实际上,您不能指望在较新的Linux系统上链接的二进制文件可以在较旧的Linux系统上工作。