簡體   English   中英

創建庫時的GCC C ++鏈接增強

[英]GCC C++ linking boost when creating a library

我想我的問題是,當僅將Boost編譯並存儲在我的主目錄中而不是在系統中時,創建存檔時靜態鏈接到Boost的正確方法是什么? 將我的程序創建為庫的想法是,我將能夠重新分發該庫文件,以供其他人鏈接到他們的程序中。

我想制作一個可以在Linux上鏈接到的C ++庫文件。 我並不在乎它是靜態的還是動態的,但是靜態可能會讓我更輕松。

我遇到的問題是,我發現的示例沒有告訴您如何鏈接庫中的其他庫。 我的圖書館使用Boost,並且我已經構建了Boost,但沒有權限將其移動到用戶區域之外。

我試過制作這樣的靜態檔案:

編譯cpp文件:

g ++ -O3-快速數學-Wall -Wextra -g -I./ -I ../../ boost / -c BuddyManager.cpp -o build / BuddyManager.o

創建靜態檔案:

ar rcs build / libppmi.a ../../boost/lib/libboost_system.a build / Application.o build / DataBlock.o (等,之后列出所有我的目標文件)

但是,當我以后鏈接到我創建的.a文件時,它會提供未定義的參考錯誤。

我設法通過在Mac上構建共享庫SO文件來創建庫,但是在該系統上,Boost安裝在標准系統位置。 當我在Linux上建立共享庫時,出現錯誤“ DSO引用了/usr/lib/crtbegin.o中的隱藏符號'__dso_handle”,並且我經常遇到無法找到Boost .SO文件的問題。 因此,我決定更改為靜態鏈接。

該系統在Scientific Linux SL版本5.3(Boron)上運行,我使用的是gcc-4.6.2。 但是,我希望它可以移植到幾乎所有版本的GCC。

謝謝。 如果不清楚,或者您想了解更多詳細信息,請詢問。

一些缺少的參考資料是:

未定義對`boost :: thread :: interrupt()的引用

boost / boost / thread / pthread / thread_data.hpp:247:未定義對`boost :: this_thread :: hiden :: sleep_until(timespec const&)'的引用

boost / boost / archive / detail / iserializer.hpp:158:未定義對`boost :: archive :: detail :: basic_iserializer ::〜basic_iserializer()的引用

他們似乎都在助推器中。 它找不到應該在Boost檔案中的引用。

有關更多信息,這是我正在編譯的內容:

ar rcs build / libppmi.a ../../boost/lib/libboost_system.a ../../boost/lib/libboost_iostreams.a ../../boost/lib/libboost_serialization.a ../。 ./boost/lib/libboost_thread.a build / Application.o build / DataBlock.o build / Iteration.o build / Launcher.o build / Message.o build / Network.o build / Processes.o build / DataBlockManager.o build /Communicator.o build / NetworkServer.o build / NetworkClientSession.o build / NetworkMessage.o build / NetworkConnection.o build / Threadable.o build / BuddyManager.o

這樣可以。 當我使用存檔時,它會中斷。 我也嘗試過從boost庫中提取.o文件,但這會帶來其他有關pthread庫的鏈接器錯誤。

您正在創建檔案的檔案,但是當鏈接程序在檔案中查找時,它將需要目標文件。 鏈接器將在libppmi.alibppmi.a並跳過所有非對象文件,包括libboost_system.a ,因為它不知道如何處理它們,因此不會找到任何Boost符號。 您可以通過與-t鏈接進行確認(如果您要使用gccg++進行鏈接,然后使用-Wl,-t-t傳遞給鏈接器),當鏈接器處理該文件時,它會打印每個文件的名稱,然后會看到它不處理嵌套檔案。

如果要在存檔中包含所有Boost代碼,則需要列出各個對象(通過直接在構建Boost的位置引用它們,或從Boost存檔中提取它們,然后將其添加到新存檔中。)

這樣可以。 當我使用存檔時,它會中斷。

當然,所有這些操作都會創建一個包含您列出的文件的存檔。 創建存檔只需要將一個單獨的文件加載到一個大文件中,就可以在其中放入任何文件類型。 它不可能真的出錯,但這並不意味着結果正確或可用。

我也嘗試過從boost庫中提取.o文件,但這會帶來其他有關pthread庫的鏈接器錯誤。

這是正確的方法,但是您遇到了另一個問題,因此請解決該問題,而不要放棄該方法。 如果您使用Boost.Thread,則需要使用-pthread進行編譯和鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM