簡體   English   中英

我可以讓gcc鏈接器創建一個靜態庫嗎?

[英]Can I have the gcc linker create a static library?

我有一個包含大約300個c ++文件的庫。

使用庫的程序不希望動態鏈接到它。 (由於各種原因,但最好的是一些受支持的平台不支持動態鏈接)

然后我使用g ++和ar創建一個靜態庫(.a),該文件包含所有這些文件的所有符號,包括庫不想導出的文件。

我懷疑將消耗程序與此庫鏈接需要花費不必要的長時間,因為.a中的所有.o文件仍然需要解析其引用,並且鏈接器有更多符號要處理。

在創建動態庫(.dylib / .so)時,您實際上可以使用鏈接器,該鏈接器可以解析所有lib內符號,並僅導出庫要導出的那些符號。 然而,結果只能在運行時“鏈接”到消耗程序中。

我想以某種方式獲得動態鏈接的好處,但使用靜態庫。

如果我的谷歌搜索是正確的,認為這確實是不可能的,我很想理解為什么這是不可能的,因為它似乎是許多c和c ++程序可以從中受益的東西。

靜態庫只是檔案(因此是“.a”),是.o文件的集合。 就像tar檔案一樣,更為簡單。 由於ar不是鏈接器,因此沒有聚合(如“ld -r”所做),因此沒有內部符號消除。

這就是為什么共享庫首先發明的原因,現在它們非常普遍,所以人們只是忽略了靜態庫的缺點。 他們只是簡單地說“它編譯它?”。

我沒有嘗試或測試過這個,但看起來ld執行增量或部分鏈接的能力可能就是你要找的東西。 在應用於將進入庫的目標文件時,檢查--relocatable選項(您可能還需要查看-Ur選項,如果處理C ++)是否可以執行您想要的操作。

我認為您應該能夠將該操作的輸出用作目標文件(或將其放在靜態庫本身中),以用於程序的最終鏈接步驟。

暫無
暫無

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

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