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

标签 c++ qt visual-studio-2015

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

我们现在需要将项目拆分为一个“核心库项目”(我们的模块测试项目链接到该项目)和一个“main() 项目”(它还链接到 lib 项目以生成可执行文件)。

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

更新:我发现目标文件大小膨胀的“罪魁祸首”- Visual Studio 的“完整程序优化”- 准确地说是“链接时间代码生成”(选项/LTCG)。我禁用了 LTCG,目标文件大小从总计 6.7GB 缩小到总计 64MB...

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

最佳答案

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

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

关于c++ - 减少发布版本中非常大的静态库的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633484/

相关文章:

c++ - 如何处理QPainter的边界矩形单击

visual-studio - 在 Visual Studio 2019 中安装 Qt

c++ - 牛顿分形生成

C++:空数组的第一个索引不会用 .resize() 填充其给定字符,但后面的每个其他字符都会

c++ - 如何在 QTreeView 中隐藏孙子

entity-framework-6 - EF6 迁移在 VS 2015 RC 上停止工作

visual-studio-2015 - 如何从 .Net Core RC2 类库创建 NuGet 包

c - 需要帮助创建可变长度数组

c++ - 使用反向remove_if删除字符串

c++ - IEEE754 float 在多大程度上满足 LessThanComparable?