簡體   English   中英

與舊版本的 libstdc++ 鏈接

[英]Link with an older version of libstdc++

安裝新的構建機器后,我發現它帶有標准 C++ 庫的 6.0.10

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

然而,我們的許多目標機器仍然使用舊版本的 libstdc++,例如:

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

顯然,最后兩個 0.0.1 中的 ABI 發生了變化,因為嘗試運行程序會導致

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

我嘗試明確安裝舊版本的 gcc 但這沒有幫助。 升級目標機器不在我的控制范圍內,所以不是一個選項。 讓我的構建在具有較舊 libstdc++ 的機器上工作的最佳方法是什么?

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

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

查看GNU ABI 政策 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 中取出),然后開始挖掘。 為我工作。

您可以使用您自己的代碼(例如在子目錄中)提供所需的共享庫,並設置 LD_LIBRARY_PATH 作為運行應用程序的先導,首先在該目錄中搜索。

提供您需要的特定版本意味着用戶安裝的版本無關緊要。 你只需要確保你也發布了所有依賴項。

另一種對我不起作用但也許其他人會發現它有用的替代方法是靜態鏈接 libgcc 和 libstdc++。

gcc 有一個-static-libgcc選項,但是僅僅使用這個選項並沒有什么效果,因為 libstdc++ 仍然是動態鏈接的。 但是通過確保 gcc 只能找到 libstdc++ 的靜態版本,就可以實現靜態鏈接。

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

問題是,boost 庫是針對較新的 libstdc++ 構建的,因此當程序正確編譯時,它會生成運行時錯誤......

如果我也重建 boost,也許這是可以解決的,還沒有嘗試過。

(作為記錄,如果您使用任何動態加載庫的代碼,例如dlopen ,靜態鏈接都是dlopen的)

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

您可以將較新的 libstdc++“走私”到客戶端系統(進入私有區域)並使用適當的-rpath鏈接程序,或者您可以將舊版本的 libstdc++ 安裝到您的計算機上。 看起來您不需要更新,並且無論如何可能由於其他原因而無濟於事。

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

為我工作:設置這個標志:

-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -Wl,-Bstatic -lgcc -Wl,-Bdynamic -static

如果只放 -static-libstdc++ -static 對我不起作用。

您是否嘗試將其與來源列表一起放入? 這假設您確實安裝了庫!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM