2010-03-15 77 views
1

我正在研究64位Linux系统,试图构建一些代码,这些代码依赖于我有二进制文件的第三方库。在连接过程中,我得到了一个未定义引用错误流的图书馆之一,表明该链接无法解析为标准C++函数/类,如引用:是不是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++程序员;但我不明白问题是什么。

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

+0

我已经成功解决了我的实际问题 - 无法构建父程序 - 通过从源代码构建第三方库。 谢谢大家。 – 2010-03-16 21:58:09

回答

6

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

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

+0

+1并注意,特别是因为库的主要版本号发生了变化,所以您可能会预料到可能会引入重大更改。 – 2010-03-15 19:18:37

+0

但是3.4.9和4.1.2的SO编号都是6.不是说明接口兼容性吗?或者我离开那里? – 2010-03-15 22:17:49

+0

当添加新符号时,它们会转到新创建的接口,因此与新版本链接的程序可以清楚地显示它需要仅存在于新版本中的接口(在您的情况下,GLIBCXX_3.4.9接口)。与旧图书馆链接的程序将继续使用同一个soname与所有新版本一起工作。 – wRAR 2010-03-16 04:09:27

1

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

+0

它是GPSTk包的一部分;他们有一个x86-64二进制dl可用。 在这一点上,我正在检查是否最简单的解决方案不仅仅是使用我已有的编译器和库从源代码构建它们的库。 – 2010-03-15 22:25:53