2010-05-22 128 views
3

有一個我想使用的開源庫。由於我想將我的軟件作爲二進制包進行分發,因此我不希望庫在其他庫上有依賴關係,所以我需要靜態鏈接這些依賴關係。如何編譯靜態鏈接依賴關係的autotools項目?

現在,由於圖書館是開源的,沒有提供二進制文件,我自己編譯它。該庫使用自動工具,並且我沒有找到有關如何靜態鏈接依賴關係的有用文檔。我所做的嘗試是使用--enable-static調用配置腳本,但這顯然只會告訴configure編譯靜態版本的庫 - 但我需要的是一個動態庫,它包含所有依賴它的庫。

所以,我需要一種方法來告訴configure以靜態方式鏈接到依賴關係,或者一種方法來後處理構建的庫以包含所有的依賴關係。誰能告訴我如何做到這一點?

哦,如果它很重要:我在64bit Snow Leopard上。

回答

2

最近我自己走了這條路,發現不幸的是靜態庫實際上並不是這樣工作的。

當您生成一個靜態可執行二進制文件時,鏈接器會查看它所需的所有函數,然後查看提供的庫列表並獲取您需要的每個函數的代碼。

當你生成一個靜態庫時,你並沒有進行任何鏈接,所以你的所有編譯代碼只是被壓縮到一個.a靜態庫中。 ('a'代表'檔案')。由於沒有鏈接階段,因此沒有任何內容檢查庫調用哪個函數。它只是有一堆'未解決的外部',將在稍後解決。

這意味着,當需要鏈接二進制文件時,需要爲所需的所有功能提供代碼(庫) - 您自己的代碼使用的函數,以及所需的所有庫函數

我完全可以明白爲什麼你想要生成一個包含你所有依賴項的庫,但是據我所知,它不能這樣工作。這就是爲什麼有像pkg-config這樣的程序,您可以使用這些程序來通知用戶(靜態或動態)庫需要鏈接哪些相關庫以便使用您的庫。

最後,請確保您檢查要鏈接的任何庫的許可證。僅僅因爲一個圖書館是開源的,並不意味着你可以逃避鏈接。如果它是一個GPL庫,那麼通過鏈接到它,您同意在GPL下發布您自己的源代碼,您可能不想這樣做。

2

如果您得到.a庫的文件,您可以嘗試在項目的Makefile.am中添加以下內容。

yourproject_LDADD = libxxx.a 
+0

非常感謝您挖掘這個老問題,但這不是一個真正的答案。我真的想擁有一個包含庫及其所有依賴項的dll。另外,我自己也不使用自動工具。 – flyx 2012-04-26 13:44:51