2016-07-15 86 views
0

我有一個第三方共享對象文件(庫文件)a.so,但是當我做 ldd -d -r a它給了很多像undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE未定義符號。我檢查和一派,發現這個符號從標準libstdc++到來。所以爲了使a.so工作,我做了如下: g++ -fPIC -static-libgcc -L. -shared -o liba.so -Wl,-soname,liba.so -L. a.so 現在,當我做ldd -d -r liba,我得到所有的參考。 但是,這裏的問題是我想與我的應用程序共享liba.so,它將在不同的linux機器上運行,其中a.so將不會被liba.so找到。 有沒有一種方法,我可以通過添加STD庫和提供的第三方共享庫到單一的共享對象,我可以使用刪除未定義的符號?如何添加到libgcc的.so文件

+0

使用'nm'工具來找出這個符號來自哪裏:'libgcc_s.so'不是含義,因爲它不包含與C++相關的符號。 (我的猜測是的libstdC++。左右) –

+0

謝謝!是你的猜測是正確的,它的libstdC++。所以 – user2018303

+0

你有沒有實際測試過這個'a.so'和遇到的問題?你收到了哪些錯誤信息? (是用C++編寫的主程序嗎?C++插件只能用於C++主程序) –

回答

0

有一種方法在那裏我可以通過添加STD庫和提供第三方共享庫成單共享對象,並且我可以使用除去未定義的符號?

號在絕UNIX系統(與AIX的一個例外)的.so是接頭的一最終產物,並進一步操縱鏈路是不可能的。

現在,您的實際問題似乎是libthird_party.so.dynamic部分中不存在對libgcc_s.so.1的依賴關係。它可能可能使用ELF編輯工具,如elfshlink二進制修補此庫。

最後,你實際上很有可能沒有一個問題來解決擺在首位。由於要運送該庫用自己的可執行文件,只要該可執行文件本身鏈接對libgcc_s.so.1,符號是第三方庫需要將出席反正。

+0

Java代碼System.loadLibrary(libthird_party.so)是第一次調用,然後是我自己的可執行文件。我需要加載這兩個庫。在第一次加載時,我得到錯誤。 – user2018303

+0

@ user2018303您的評論沒有任何意義。你的可執行文件與Java有什麼關係? –

相關問題