2010-03-03 43 views
5

讓我來解釋一下這個場景。我們有一個傳統的C++編譯.so庫。這個庫中的函數聲明爲extern "c" {},所以該庫可以被C和C++程序使用,另外,由於某種原因它使用--static-libgcc選項創建。如何編寫C .so庫來替代現有的C++ .so庫?

這個舊圖書館很古老,很難維護。現在我們已經設法寫出它的替代,但是用C語言。假設舊庫叫做libfoo.so(舊),而新庫是libfoo.so(新)。對於給定的bar.o,它可以與舊的或新的libfoo.so鏈接來創建可執行文件,比如bar.exe。但bar.exe只能運行與之前鏈接的相同的.so庫,換句話說,這兩個庫不可互換。

編輯#1:我做了libfoo.so命名的符號鏈接指向libfoo.so的(舊)或libfoo.so(新)。這個符號鏈接libfoo.so在運行時位於LD_LIBRARY_PATH中。

編輯#2:當我掛文件bar.o老libfoo.so和產生bar.exe,如果我跑這bar.exe新libfoo.so,該公司報告的undefined symbols錯誤。通過nm這兩個libfoo.so,我可以在舊版本中找到這些符號,但不能在新版本中找到。這些符號類似於_ZSt4cerr,這是一個C++ lib損壞的名稱(雖然它是由--static-libgcc提供的),當然新的libfoo.so也不包含這些類型的符號。

編輯#3:如果我只是編譯和鏈接的C代碼與g ++而不是gcc,它有什麼意義嗎?

我該如何實施?

EDIT#4:今天我設法編譯/鏈接新的C程序性與克libfoo的++(靜態libgcc中,靜態的libstdC++),這可能會導致將包含在所有libfoo.so C++符號。這可以使一切順利運行,但不是我真正想要的。

+0

爲什麼它沒有與新庫運行?你會得到什麼樣的錯誤信息? – 2010-03-03 12:31:44

+0

他沒有收到錯誤消息。他正在修理一些沒有損壞的東西,只是大聲地批評。 – 2010-03-03 12:57:58

+0

請參閱編輯#2,我已更新我的問題。謝謝! – solotim 2010-03-03 13:12:10

回答

0

給它們相同的名字並放到不同的目錄中。使用LD_LIBRARY_PATH環境。變量在任何其他目錄之前用所需的庫設置目錄。

2

如果你建立和鏈接新的,你能得到它與舊的鏈接?這聽起來像你生成了一個二進制兼容庫,但只在一個方向。

+0

是的。如果我建立並鏈接新庫,生成的bar.exe可以同時運行新舊庫。但爲什麼? – solotim 2010-03-04 02:33:13

+0

這意味着新庫的頭文件依賴於比舊庫更少的符號。 http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html可能會提供更多關於二進制兼容共享庫的內容和方式的信息。 – Jan 2010-03-04 12:42:36

1

編輯#2幫助。

基本上你的bar.exe正在嘗試爲該庫執行C++運行時初始化。

您必須至少提供空洞的相同名稱的名稱,以便bar.exe可以動態地搜索您的.so並查找/調用它們。

如果你不那麼幸運,那麼你可能需要實際上讓這些函數做一些有意義的事,上層代碼將其解釋爲成功。

好運

+0

或者,更簡單的答案,C .so替換C++ .so是不實際的...? :( – solotim 2010-03-04 02:39:10