讓我來解釋一下這個場景。我們有一個傳統的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++符號。這可以使一切順利運行,但不是我真正想要的。
爲什麼它沒有與新庫運行?你會得到什麼樣的錯誤信息? – 2010-03-03 12:31:44
他沒有收到錯誤消息。他正在修理一些沒有損壞的東西,只是大聲地批評。 – 2010-03-03 12:57:58
請參閱編輯#2,我已更新我的問題。謝謝! – solotim 2010-03-03 13:12:10