我正在开发一个 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++ 程序员。但我不明白问题是什么。
非常感谢任何建议。谢谢。