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

C++标准库不是向后兼容的吗?,c++,version,backwards-compatibility,std,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> &

我正在一个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)'
所以我读到,第三方库之一的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++程序员;但我不明白问题出在哪里


非常感谢您的建议。谢谢

C++运行时往往是特定于编译器的,而您要查找的库肯定是特定于编译器版本的。请记住,即使接口没有更改,内部也可能会更改


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

C++运行时往往是特定于编译器的,而您要查找的库肯定是特定于编译器版本的。请记住,即使接口没有更改,内部也可能会更改


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

从哪里获得librxio.so.16.0?我认为它是用GCC>4.1编译的,因此它可能无法在4.1运行时运行。

您从哪里获得librxio.so.16.0?我认为它是使用GCC>4.1编译的,因此可能无法使用4.1运行时。

+1请注意,特别是由于库的主要版本号发生了更改,您可能会期望引入突破性的更改。但3.4.9和4.1.2的数量都是6。这不表示接口兼容性吗?或者我离这里很远?当添加新符号时,它们会转到新创建的接口,因此与新版本链接的程序可以清楚地显示它需要一个仅存在于新版本中的接口(在您的情况下),即GLIBCXX_3.4.9接口。与旧库链接的程序将继续与使用相同soname.wRAR的所有新版本一起工作-但在这种情况下,ld并没有说我需要一个比现有库更新的库;这是说我需要一个旧的。它抱怨我需要3.4.9,而我有4.1.2。有趣的是,当我使用nm查看libstdc++4.1.2中的符号时,我看到定义了GLIBCXX_3.4.n,其中n=1-8;gcc主页上没有显示gcc/glibc++的v3.4.9版本,它们被捆绑在一起并进行了版本控制,显然是在。所以我不知道3.4.9是什么。同时,我通过从源代码构建GPSTk解决了实际问题。但我不明白这一点,这让我很恼火。+1并注意到,特别是由于库的主要版本号发生了变化,您可能会期望引入突破性的更改。但3.4.9和4.1.2的数字都是6。这不表示接口兼容性吗?或者我离这里很远?当添加新符号时,它们会转到新创建的接口,因此与新版本链接的程序可以清楚地显示它需要一个仅存在于新版本中的接口(在您的情况下),即GLIBCXX_3.4.9接口。与旧库链接的程序将继续与使用相同soname.wRAR的所有新版本一起工作-但在这种情况下,ld并没有说我需要一个比现有库更新的库;这是说我需要一个旧的。它抱怨我需要3.4.9,而我有4.1.2。有趣的是,当我使用nm查看libstdc++4.1.2中的符号时,我看到定义了GLIBCXX_3.4.n,其中n=1-8;gcc主页上没有显示gcc/glibc++的v3.4.9版本,它们被捆绑在一起并进行了版本控制,显然是在。所以我不知道3.4.9是什么。同时,我通过从源代码构建GPSTk解决了实际问题。但我不明白这一点让我很恼火。这是GPSTk软件包的一部分;他们有一个x86-64二进制dl可用。在这一点上,我正在检查最简单的解决方案是否不仅仅是使用编译器和我得到的库从源代码构建它们的库;他们有一个x86-64二进制dl可用。此时,我正在检查最简单的解决方案是否不仅仅是使用编译器和我拥有的库从源代码构建它们的库。通过从源代码构建第三方库,我成功地解决了我的实际问题——无法构建父程序。谢谢各位。我已经成功地解决了我的实际问题——不是一个好学生 能够构建父程序-通过从源代码构建第三方库。谢谢各位。
$ 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