【问题标题】:VC++ linker to remove indirect dependencies for static librariesVC++ 链接器删除静态库的间接依赖
【发布时间】:2016-05-18 05:16:38
【问题描述】:

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

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 的想法吗?

标签: c++ c visual-studio


【解决方案1】:

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

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

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

【讨论】:

  • 我知道fc相关的东西都被拖进去了,但是不知道为什么需要,这是我的问题。顺便说一句,b.lib 已获得适当许可。但是当我不需要的时候,我什至不想发布它的机器代码,因为我们将 b.lib 用于非常特殊的产品,而 a.lib 是在我们所有的产品之间共享的。
  • 在不了解 b.lib 内部的情况下,我们无法说出为什么需要它。
  • 你说“当我不需要的时候,我什至不想发布它的机器代码,因为我们将 b.lib 用于非常特殊的产品”,但这没有意义我。你有使用 b.lib 的许可,在需要时使用它 - 如果某些机器代码被拖进来,为什么对你很重要?
  • 您是否试图向您的客户隐瞒您正在使用 b.lib?我不会打扰。
  • 我的理由可能无法立即理解,但这是一个技术问题,在大多数情况下,最终产品的大小确实很重要,尤其是移动和嵌入式平台。另外,b.lib 的内部结构如何影响未调用函数的链接?你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多