gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:18 25 4
gpt4 key购买 nike

考虑这种情况( Release模式下的一切):

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

最佳答案

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

我不担心公开您对 b.lib 的使用(前提是您已获得适当许可),保护知识产权是供应商的问题。

可执行文件的大小是一个真正的问题,但我认为您对此无能为力。

关于c++ - VC++链接器删除静态库的间接依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37290828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com