2012-02-15 37 views
1

有一個免費的軟件項目可以構建一些靜態C++庫,然後將它們鏈接起來製作一個二進制文件。我想分開這些庫作爲 .so文件進行動態鏈接(所以其他項目可能會使用 這個lib)。一個庫構建得很好,但是當我嘗試鏈接 時,我得到「未定義的引用」錯誤。靜態與動態庫中的符號分辨率

這些很容易追蹤和修復(在.h文件中引用那些 方法的代碼,但對應的.cc文件不是包含在Makefile編譯命令中的 )。不過,我想知道,爲什麼一般情況下,圖書館只能將 作爲靜態庫鏈接,而不能作爲動態庫鏈接。什麼是 g ++和ld在一個情況下做,但不是另一個?

非常感謝。

+0

未引用對象實際上在靜態庫中生成的位置在哪裏?它是一些其他的靜態庫,一些其他的共享庫,或一些.o文件?什麼是參考,其中一個圖書館? – 2012-02-15 19:16:24

回答

5

靜態庫,與AR創建只是一羣目標文件。 ar是一個非常簡單的歸檔。在鏈接時沒有依賴關係解決,請參閱手冊頁ar

另一方面,共享對象或動態庫,你稱他們是一個非常不同的野獸。他們實現了ELF二進制格式並且有一個複雜的規則集。他們也有初始化代碼,並且一些依賴關係在鏈接時解決。有關更深入的介紹,請參閱http://www.akkadia.org/drepper/dsohowto.pdf和。

+0

謝謝,喬治。這些鏈接很有幫助。 – JLV 2012-02-15 22:02:44

+0

如果答案有幫助,那麼你仍然可以upvote /接受它,JLV。 – 2012-02-16 21:13:53

0

但是當我嘗試鏈接它時,出現「undefined reference」錯誤。

向我們展示您的鏈接命令。由於共享庫允許允許(默認情況下)具有未解析的符號,所以在鏈接共享庫時,「未定義的引用」錯誤通常是而不是

或者當您將最終的可執行文件鏈接到共享庫時,您是否意味着出現「未定義引用」錯誤?