2010-03-15 49 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