考慮這種情況(在釋放模式的一切):VC++鏈接器刪除間接依賴於靜態庫
a.lib includes f1() and f2().
a.lib is built using /LTCG on VS2015.
f1() is local without any external function calls.
f2() calls fc() from b.lib
b.lib includes fc() and 100s of other functions.
b.lib is built by a 3rd party, probably not VS.
main.exe is built only with main.cpp, using /LTCG on VS2015.
main.exe links to a.lib and b.lib
main.cpp only calls f1()
現在,當我建立MAIN.EXE,我希望它僅包含F1()的實現。可執行文件的大小是〜10MB。但是,如果我在a.lib中註釋掉f2()的實現並重建a.lib,那麼main.exe就會變成200KB。它在兩種情況下都完全相同。
我擔心的是可執行文件的大小,並且暴露了有關b.lib(這不是我自己的庫)的任何不必要的內容。
問題:爲什麼鏈接器不夠智能,不能包含f2() - > fc()的定義?而它足夠聰明,不包括b.lib的其餘部分(超過100MB)?
您可以嘗試使用C/C++/Gy選項構建a.lib並使用鏈接器/ OPT選項鍊接您的可執行文件嗎? –
/Gy已經爲a.lib定義,對於可執行文件/ OPT:ICF和/ OPT:REF已經啓用。心中有另一個/ OPT嗎? – Alparslan