[英]gcc linking shared library works, but dlopen of the same shared lib fails
我有一個看起來像這樣的項目:
executable
\---> bsp.so
|---> bsp_protobuf.a
\---> protobuf.a
其中有兩個首先構建的靜態庫(兩個protobuf庫)被靜態鏈接到bsp.so共享庫中。 然后最后bsp.so被鏈接到可執行文件。
當我在命令行上使用gcc
鏈接可執行文件並鏈接bsp.so時,它鏈接確定。
但是,如果我不鏈接bsp.so,那么它也可以正常構建-這是設計使然-因為我想使用dlopen()
來確定是否需要該庫(我有對象的指針,但沒有實例化的指針等) ...)。
我的問題是,當我在代碼中使用dlopen()
,由於未定義符號而無法打開庫。 有問題的符號位於靜態庫中。
我真正難以理解的是,為什么它在命令行上起作用,但是當我使用dlopen()
和運行時卻不起作用。
我還有其他3-4個可以成功使用dlopen()
共享庫-因此,我知道使用dlopen()
一般過程很好。
我正在使用dlerror()
來獲取未定義的符號錯誤消息。
我看了以下鏈接:
我把-Wl,--whole-archive
想法捆綁在一起,但是似乎太多了,並且構建失敗並發出了很多警告-可能與Google protobuf東西有更多關系,再加上我不確定這是什么方法我想結束了。
我檢查了我的共享庫是使用-fPIC
,我不確定靜態庫是否是使用-fPIC
或者是否需要?
我也在這里看:
其中討論了如何與dlopen()
鏈接,但這使用的是libtools-我們的所有目標都沒有,所以我不想使用libtools。
我真的不確定前進的方向-感覺這應該是某個地方的簡單修復-但正如我所說,我無法理解為什么一種方法有效而另一種無效...
更新
因此,在Sam發表評論后,我開始尋找正確的地方。 事實證明,bsp.so的makefile僅靜態鏈接兩個庫之一。 對於共享的庫,有一個單獨的測試程序可以鏈接兩個庫(因此測試程序可以正常工作),而且我沒有理由懷疑該庫已損壞……好吧,我在dlopen和鏈接等方面學到了很多知識::o
當您將可執行文件與共享庫鏈接時,共享庫必須解析來自可執行文件的未解析符號引用,否則鏈接將失敗。
當您鏈接共享庫時,不需要共享庫本身中所有未解析的符號都必須由與其鏈接的任何其他共享庫來解析。 因此,當您將共享庫鏈接在一起時,可能會出現共享庫本身中未解析的符號的情況。
將可執行文件與共享庫鏈接成功,因為共享庫中解析了可執行文件中所有未解析的符號; 但是由於共享庫本身無法解析的符號引用,可執行文件將無法加載。 或者,對共享庫進行dlopen
()處理會產生相同的錯誤。
dlopen
手冊頁還描述了幾個可用於控制此行為的可選標志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.