VC ++链接器删除静态库的间接依赖项

时间:2016-05-18 05:16:39

标签: c++ c visual-studio

考虑这种情况(一切都处于发布模式):

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)?

1 个答案:

答案 0 :(得分:1)

链接器正在拖动fc可能正在使用的所有静态(如错误编号到字符串的映射),以及fc调用的所有函数(可能)以及所有函数静态用来初始化自己。

我不担心暴露您对b.lib的使用(假设您已获得适当的许可),保护IPR就是供应商的问题。

可执行文件的大小是一个真正令人担忧的问题,但我认为你无法做到这一点。