减少发布版本中非常大的静态库的大小

Reducing the size of a very large static library in Release builds

我们在 Windows 7/10 和 Visual Studio 2015 年工作,使用 C++ 和 Qt 进行编码(并与少数其他外部库链接)。我们的项目比较大,1300多个类,几十万个LOC

我们现在需要将项目拆分为 "core lib project"(我们的模块测试项目链接到的)和 "main() project"(它还与 lib 项目链接以生成可执行文件) .

我 运行 遇到的问题是从 "core lib project" 创建的库是巨大的——至少在发布模式下是这样。我们的应用程序(以其当前的单一项目形式构建时)最终大小约为 40MB。库达到 ~4GB(!),然后由于链接失败而出现问题;目标文件目录中有 ~7GB 的 .obj 。 (在调试模式下,情况要温和得多——库和 .obj 文件目录不超过 ~350MB)。对于可能导致这种大小 inflation 的任何提示(特别是因为最终所有测量值微不足道 ~40MB)或如何减少它,我将不胜感激...

更新:我发现膨胀目标文件大小的 "culprit" - Visual Studio 的 "Full program optimization" - "link time code generation"(选项 /LTCG)是准确的。我禁用了 LTCG,目标文件大小 sh运行k 从总计 6.7GB 到总计 64MB...

也就是说,我不太希望减少库的大小,因为在创建库期间链接器可能还不能确定它可以优化什么(与在创建最终可执行文件期间不同)。

难怪静态 linked 二进制文件是最短的;未使用的目标文件被删除,目标文件中很可能未使用的代码被 link 优化器排除。

我怀疑基于构建模式的过度调节。你玩过 _Debug 宏和预处理器指令吗? 项目依赖项和 linkage 宏呢? make 文件是否已损坏或未谨慎篡改?