考虑这种情况(一切都处于发布模式):
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)?
答案 0 :(得分:1)
链接器正在拖动fc
可能正在使用的所有静态(如错误编号到字符串的映射),以及fc
调用的所有函数(可能)以及所有函数静态用来初始化自己。
我不担心暴露您对b.lib的使用(假设您已获得适当的许可),保护IPR就是供应商的问题。
可执行文件的大小是一个真正令人担忧的问题,但我认为你无法做到这一点。