2016-05-18 78 views
1

考虑这种情况(在释放模式的一切):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)?

+1

您可以尝试使用C/C++/Gy选项构建a.lib并使用链接器/ OPT选项链接您的可执行文件吗? –

+0

/Gy已经为a.lib定义,对于可执行文件/ OPT:ICF和/ OPT:REF已经启用。心中有另一个/ OPT吗? – Alparslan

回答

1

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

我不担心公开使用b.lib(假设您已经正确授权),保护知识产权是供应商的问题。

可执行文件的大小是一个真正的问题,但我不认为你可以对此做很多事情。

+0

我知道所有与fc有关的东西都被拖入,但我不知道为什么它是必要的,那是我的问题。 顺便说一句,b.lib是正确的许可。但是当我不需要的时候,我不想发布它的机器代码,因为我们使用b.lib来做非常特殊的产品,而a.lib是我们所有产品之间共享的。 – Alparslan

+0

不知道b.lib的内部,我们不能说为什么它是所有需要的。 –

+0

你说:“我不想在我不需要的时候发送它的机器代码,因为我们使用b.lib来生产非常特殊的产品”,但这对我来说没有任何意义。您有使用b.lib的许可,在需要时使用它 - 如果某些机器代码被拖入,为什么对您有影响? –