C ++标准库不向后兼容吗?

时间:2010-03-15 17:48:43

标签: c++ version backwards-compatibility std

我正在开发64位Linux系统,尝试构建一些依赖于我有二进制文件的第三方库的代码。在链接期间,我得到其中一个库的未定义引用错误流,表明链接器无法解析对标准C ++函数/类的引用,例如:

librxio.a(EphReader.o): In function `gpstk::EphReader::read_fic_data(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
EphReader.cpp:(.text+0x27c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
EphReader.cpp:(.text+0x4e8): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'

我不是一个真正的C ++程序员,但在我看来,它无法找到标准库。做了一些研究,当我看到librxio对标准库的依赖时,我得到了以下内容:

$ ldd librxio.so.16.0
./librxio.so.16.0: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./librxio.so.16.0)
   libm.so.6 => /lib64/libm.so.6 (0x00002aaaaad45000)
   libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002aaaaafc8000)
   libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002aaaab2c8000)
   libc.so.6 => /lib64/libc.so.6 (0x00002aaaab4d7000)
   /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

所以我读到这就是说librxio(第三方库之一)至少需要标准库的v3.4.9。但我安装的版本是4.1.2:

$ rpm -qa | grep libstdc
compat-libstdc++-33-3.2.3-61.x86_64
libstdc++-devel-4.1.2-14.el5.i386
libstdc++-devel-4.1.2-14.el5.x86_64
libstdc++-4.1.2-14.el5.x86_64
libstdc++-4.1.2-14.el5.i386

不应该这样吗?共享对象主编号为6,与v3.4.9相同。在这个级别,这不应该向后兼容吗?看起来第三方库正在寻找标准库的早期版本而不是我安装的版本;但是,共享库的主要编号相同的版本之间是否存在向后兼容性?同样,我不是一个真正的C ++程序员;但我不知道问题是什么。

任何建议都非常感谢。谢谢。

2 个答案:

答案 0 :(得分:6)

C ++运行时往往是特定于编译器的,而您正在寻找的库肯定是特定于编译器版本的。请记住,即使界面没有改变,内部也可能。

您需要获取使用相同编译器构建的库。您拥有的库版本,或安装适当的编译器/库版本。

答案 1 :(得分:1)

你从哪里得到librxio.so.16.0?我认为它是用GCC编译的&gt; 4.1,因此它可能不适用于4.1运行时。