2010-01-18 63 views
24

的安裝新構建機器之後,我發現它來與C++標準庫鏈接使用較早版本的libstdC++

-rw-r--r-- 1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10 

我們的許多目標機器的6.0.10,但是,仍然使用舊版本的libstdC++,例如:

-rwxr-xr-x 1 root root 985888 Aug 19 21:14 libstdc++.so.6.0.8 

顯然,ABI在最後兩0.0.1的改變,如試圖在

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found 
運行程序結果

我試着明確安裝一箇舊版本的gcc,但沒有幫助。 升級目標機器超出了我的控制範圍,所以不是一個選項。讓我的構建能夠在具有較舊libstdC++的機器上工作的最佳方式是什麼?

我在apt-cache中搜索了較舊的libstdC++版本進行安裝,但顯然沒有舊版本的6可用?

回答

18

您不需要鏈接到不同的庫,您需要使用舊版本的編譯器。

看一看the GNU ABI policy。 libstdC++共享庫設計爲向前兼容。即如果你需要6.0.8,可以使用6.0.10版本。在這個策略中,你可以從gcc-4.2.0開始閱讀,需要6.0.9,所以你需要一個gcc-4.1.x。

總之,這就是爲什麼有您的系統上只有一個的libstdC++。so.6.0.x,你只需要最新的。

至於設置你的編譯系統只使用特定版本的編譯器:確保不能使用標準的g ++(重命名鏈接,刪除提供它的包,從PATH中取出它),以及開始挖掘。爲我工作。

+0

你的意思是我們必須安裝一箇舊版本的g ++嗎? – 2011-07-08 03:49:51

+0

@Peter是的,拿G ++鏈接到舊版本的libstdC++的舊版本。所以 – Jan 2011-07-08 11:50:44

+10

我覺得這是很蹩腳的,爲了使用C++庫的舊版本,你不得不忍受這可能有缺陷,編譯器和失蹤優化 - 尤其是因爲其他方式輪(使用舊的編譯器,一個新版本的庫)似乎只是一個設定'LD_LIBRARY_PATH'的問題。 – 2013-09-25 12:42:02

6

您可以使用您自己的代碼(例如,在一個子目錄中)發佈所需的共享庫,並將LD_LIBRARY_PATH作爲運行應用程序的先驅,以首先在該目錄中進行搜索。

運送您需要的特定版本將意味着用戶安裝的版本無關緊要。你只需要確保你發佈了所有的依賴關係。

1

已經遇到過這個。我沒有想到使用與目標機器相同的配置安裝系統(虛擬化?)來構建可分發的二進制文件。

+1

,而這肯定是一種選擇,這似乎這麼多的工作簡單地用舊的庫鏈接......我希望有更好的選擇將被張貼說實話:) – Pieter 2010-01-18 11:25:04

+0

另外一個選擇是安裝的版本完全相同目標系統上存在的stdC++庫。但是,由於它在發行版中默認不存在,所以您必須手動完成。這不會是微不足道的,而且會讓你的系統中共存的2版本真正令人頭痛。設置舊的發行和編譯它是一兩個小時(如果你不使用,很多異國庫),並與圖書館設置的手動第二個版本是真的值得。 – 2010-01-18 14:10:48

+0

你不需要安裝一個完整的系統 - 剛剛成立的第二個工具鏈,如果你是交叉編譯,而是針對自己的平臺。 – ephemient 2010-01-18 19:33:32

1

替代方法不適用於我,但也許別人會發現它很有用,它是靜態鏈接libgcc和libstdC++。

gcc有一個選項-static-libgcc,但是簡單地使用這個選項並沒有實現,因爲libstdC++仍然是動態鏈接的。但通過確保gcc只能找到靜態版本的libstdC++,就可以實現靜態鏈接。

ln -s `g++ -print-file-name=libstdc++.a` 
g++ -static-libgcc -L. source.cpp 

問題是,Boost庫建成對新的libstdC++,所以在程序編譯正確,它會生成運行時錯誤...

也許這是可以解決的,如果我重新提振也避風港」 t試過了。

(備案,如果你使用的動態加載庫中的任何代碼,通過例如dlopen,靜態鏈接是一切無從談起)

+0

你只需要使用-static-libstdC++並且不需要符號鏈接魔術。 – Kaa 2017-12-29 00:44:13

2

您可以「走私」的新的libstdC++到客戶端系統(成一個私人區域),並將程序與適當的-rpath鏈接,或者您可以將舊版本的libstdC++加載到您的計算機上。它看起來不像你需要的更新,無論如何,這可能是其他原因。

注意:在FreeBSD上,libstdC++與編譯器(我安裝了gcc4.2,4.4和4.5,每個都有自己的libstC++)結合在一起。嘗試安裝一個較舊的(與客戶端系統匹配的)版本的gcc,它可能會攜帶您正在尋找的較舊的libstdC++。

0

你有沒有嘗試過把它與源列表放在一起?這假定你實際上已經安裝了庫!

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp 
+0

libstdC++不能以這種方式包含。有一個static-libC++選項,但它通常不是你想要的。 – phord 2012-02-23 22:26:12

相關問題