簡體   English   中英

靜態鏈接時,鏈接器是否包含整個庫?

[英]When linking statically, does the linker include the whole library?

例如,如果我靜態鏈接到freeglut,編譯器是否包含freeglut中的所有內容或僅包含我使用的部分? 當然,這意味着鏈接器(或編譯器?)會進行某種依賴性分析,以確定它可以安全排除的內容。

如果是這樣,有沒有辦法查看Visual Studio中包含或排除的內容?

這部分是一個實施質量問題,但有一個真正的問題。

也就是說,通過標准,鏈接器必須添加所有引用的編譯單元 但是說在庫中,你有一個只有一個靜態變量的編譯單元,它的初始化注冊了一些東西注冊表,例如消息處理,工廠,等等,或者它的構造函數和析構函數輸出,分別是“在main之前”和“主要之后”。 如果引用了該編譯單元中的任何內容,則鏈接器只能跳過它,將其刪除。

因此,為了確保這些靜態變量不被優化,使用符合標准的工具鏈,在該編譯單元中引用某些東西是必要且充分的。

在Visual Studio中重新看到包含的內容,據我所知,除了要求鏈接器的詳細輸出之外沒有辦法,比如,鏈接器選項/verbose:ref

但是,使用該選項可以獲得非常詳細的輸出。

另一種方法是向鏈接器詢問映射文件,例如,鏈接器選項/map:blah

不過,這個輸出也非常冗長。

是的,鏈接器將僅包含代碼引用的轉換單元。

如果為可執行文件生成映射文件,則可以確切地看到它包含的內容。

鏈接器僅包含所需的符號。

可能, 關於檢查* .lib文件的問題,回答第二部分(dumpbin也適用於* .exe文件)。

我想你可以寫一個樣本庫來得到答案。 在C ++庫中,1編寫一個類來打印所有子類名稱。 2和幾個派生自它的類。

在真正的主程序中,只需使用其中一個子類。

然后打印所有名稱。

我想你會找到答案。

暫無
暫無

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

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