2010-08-31 118 views
4

一個簡單的問題 - 有什麼辦法可以使g++鏈接器與特定的libstdc++庫版本鏈接?我在gcc/g++的手冊頁中找不到任何有用的東西,在這裏沒有其他問題。如何鏈接特定庫(g ++; libstdC++。so.5和libstdC++。so.6)

以下是情況 - 我的應用程序使用特定的共享庫,它使用libstdc++.so.5構建,我想要在RHEL5上安裝和使用它。所以,當我嘗試建立一個RHEL5機上的應用,我得到了警告:

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6 

安裝,因爲無能compat-libstdc++轉速沒有幫助,對std::string析構函數的程序崩潰, 。所以,這RHEL5機器上我有這樣的:

[[email protected]]# ll /usr/lib/libstd* 
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so 
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so 
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7 
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7 

,當我做

[[email protected]]# ldd my_exe 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000) 
... 
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000) 

這是不好的,因爲我知道這是未定義的行爲:/

那麼,有沒有什麼辦法僅使用libstdc++.so.5構建我的可執行文件? (刪除libstdc++.so.6不是一個選項,因爲很多原因,靜態鏈接也不是一個選項)。

非常感謝!

回答

5

這裏是ABI versions table;在同一時間,-fabi-version開關的默認值從1變爲2 g ++在3.4中引入了libstdC++。so.6。這意味着,針對的libstdC++庫中的較舊的鏈接,你將需要

  • 查找和使用等效的C++頭文件,而不是包含在你的編譯器的那些的
  • 重新編譯所有的代碼(以及任何其他C++庫你」重新使用)與-fabi-version=1

否則您運行ABI不兼容的風險。我無法準確告訴你所做的更改是什麼,但總的來說,最好嘗試保留使用相同編譯器版本編譯的所有C++代碼。

假設你不想嘗試和黑客的東西togther這樣,我認爲你有兩個選擇:

  1. 問你的共享庫的供應商與GCC的版本供您重新編譯庫。這可能不是微不足道的,因爲g ++ 3.4引入了新的更嚴格的C++解析器。
  2. 問你的供應商他們用什麼版本的g ++首先編譯庫並使用該版本編譯自己的代碼。 RH可能會提供compat-gcc編譯器以及libstdC++ - 我不記得了。但是,您還需要使用所有其他庫和操作系統提供的C++庫的低級版本,因此使用具有正確編譯器的舊版Red Hat版本時,可能最容易在VM上編譯。
+0

好吧,我嘗試了第一個選項,仍然沒有。我仍然在那裏等待幫助,所以我不認爲他們會重新編譯庫。 關於第二個 - 我需要在RHEL5機器上使用該應用程序,所以我不需要較舊的操作系統庫,只需要libstdC++。如果他們告訴我他們用於編譯oracle庫(OCCI 10.2.0.3)的gcc版本,我將使用RHEL5和特定的gcc版本創建虛擬機。希望這會有所幫助:/ 感謝您的迴應! BR, Kiril – 2010-08-31 11:43:28

+0

對不起,沒有幫助: - /在一個捏你可以運行一個單獨的進程爲libstdC++。so.5代碼,並使用IPC之間傳遞數據。甚至可以用舊GCC編寫一個C封裝器庫,並將它鏈接到你的新代碼中,這樣兩者之間就沒有C++邊界了,但你必須非常小心庫鏈接順序。 – Rup 2010-08-31 12:01:08

+0

啊,是的,這真是個好主意!不幸的是,我沒有時間來解決這個問題,但這對其他應用程序非常有用。非常有趣的想法。謝謝! – 2010-08-31 12:11:44

相關問題