6

我從來沒有考慮過靜態庫和動態庫之間的大小差異,直到我今天下載了預建的boost庫。我發現boost的靜態庫比動態庫要大得多。靜態和動態(調試)庫之間的大小差異以及對最終exe的影響

例如,調試多線程助推波靜態庫的大小爲97.7 mb,而同一個庫(但是動態的)的大小僅爲1.4 mb(包括導入庫和dll)!這是一個巨大的差異。 這是爲什麼?

第二個問題,如果我靜態鏈接,比如說,wave庫。這是否意味着我的可執行文件的大小會超過97.7 mb

回答

4

靜態庫在其中包含完整的調試符號信息。對於信息將在.pdb文件中的DLL(我認爲它的大小與靜態庫相似)。

當你鏈接到靜態庫,符號信息不會被複制到.exe文件 - 它將被放置在.pdb文件(如果您的構建被配置爲創建一個.pdb文件)。無論是否創建.pdb,.pdb文件都不需要與.exe一起分發。

在預建庫下載我從boostpro.com得到的,我沒有得到.pdb文件爲他們提供升壓的DLL。如果你自己構建DLL,你可能會得到.pdb文件(儘管你可能需要設置一些配置選項,我不知道細節是什麼)。


更新:

看起來我可能是錯的容易獲得的.pdb文件進行升壓的DLL。從http://comments.gmane.org/gmane.comp.lib.boost.build/23246

> Is there an additional option that I can pass on the command line to 
> have the (correctly generated) PDB files also copied into the stage 
> directory? 

不是在這個時候。你只能砍 tools/build/v2/tools/package.jam到 添加<install-type>PDB無處不在哪裏 <install-type>SHARED_LIB<install-type>STATIC_LIB現在 寫的。

+2

這是非常有趣的...他們是否編譯發佈靜態庫與調試信息?這不會允許整個程序優化,從而慢的代碼(或我在這裏錯了)? – Samaursa 2011-01-06 08:40:27

3

不,只是因爲LIB文件具有一定的大小,並不意味着它會將該大小添加到您的EXE中。事實上,大多數鏈接器都足夠聰明,只需鏈接所用的東西。將其與動態庫相比較,該庫必須包含所有內容。

靜態庫絕對會讓你的EXE變大,但我總是更喜歡它。然後,我不必擔心在運行時丟失或不兼容的庫。 (或者至少,我將這種可能性降至最低。)

0

調試靜態庫包含調試信息,它解釋了巨大的尺寸差異。

1

由於靜態庫不包含完成的二進制數據,而是鏈接器構建二進制文件所需的信息,因此此信息可能比構建的二進制文件大。

當在cpp-file中使用頭文件中定義的某些函數時,編譯器將其代碼(內聯或簡單添加)放到生成的目標文件中。這意味着會有很多重複。這是連接器的工作合併它們,所以靜態庫只是等待連接,以減少:)

一般可執行文件的大小通常與靜態庫大,但可執行文件的動態庫一起的大小通常較小。 DLL和EXE分開鏈接,因此鏈接器無法知道DLL中需要哪些功能以及哪些功能可以被丟棄。在靜態庫的情況下,鏈接器具有這樣的信息並且可以僅採用那些使用的obj文件。

相關問題