[英]Linker PIC error when statically linking a library built with PIC enabled
[英]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.