【问题标题】:Release LIB is huge compared to debug与调试相比,发布 LIB 是巨大的
【发布时间】:2010-01-12 20:30:48
【问题描述】:

我有一个带有标准调试/发布构建选项的静态库项目。我很感兴趣地发现,虽然调试 .lib 是相当大的 22Mb,但发布版本却高达 100Mb。这也不是一个庞大的代码库,大约有 75 个类,而且没有一个非常庞大。

我的问题是这是否正常,我是否应该关心?

【问题讨论】:

  • 你问的是静态库项目,对吧?
  • 是的,对不起。编辑澄清。
  • 我现在有这个问题。找到原因了吗?

标签: visual-c++


【解决方案1】:

我会检查您是否在发布模式下静态链接库并在调试模式下动态链接它们。例如,您可能正在静态链接 C++ 运行时。

【讨论】:

  • 假设他询问的是静态库项目,静态库从未与项目中的任何内容链接。静态库的链接仅在使用库时发生。
  • 正确的尼尔。这里没有链接,只有外部#includes
【解决方案2】:

我遇到了同样的问题。修复非常简单。 Project Property/Configuration properties/General/Whole Program Optimization使用No Whole Program Optimization代替使用链接时间码生成。我的静态库的大小从 5MB 减少到 1.3MB

【讨论】:

  • 不知道为什么,但这就是我的原因。除非您在某处部署 .lib 文件,否则这应该不是问题。如果您只是将它们保留在您的解决方案的本地,您应该没问题,因为消耗静态库的 .exe 或 .dll 文件将消除它不需要的东西。我的问题:stackoverflow.com/questions/2472568/…
【解决方案3】:

不,这不正常。应该反过来。是的,你应该关心。

我会再次查看大小,以确保我没有以某种方式转换发布和调试大小。

然后查看您要链接的库以进行发布和调试。您是否不小心将调试库链接到了发布,并将库发布到调试?

仔细查看您的发布和调试设置。发生了一些非常可疑的事情。

【讨论】:

    【解决方案4】:

    是否有可能大量的这段代码是内联的,而调试版本不是“内联”的?

    【讨论】:

      【解决方案5】:

      理想的发布库应该小于调试库。

      我猜你可能正在静态链接其他库,例如 MFC 、ATL 等...

      检查您的发布和调试构建设置。

      使用#pragma once 避免多次包含文件。

      【讨论】:

        【解决方案6】:

        我通常会期望相反...

        是否有可能在预处理器包含的块中存在大量代码,这些代码只包含在发布版本中?

        在这种情况下,模板代码尤其值得怀疑。

        更新

        我认为这个问题很可能是由于在发布模式下链接到静态库,而在调试模式下链接到共享库......

        +1 karoberts

        【讨论】:

        • 模板代码在 Debug 构建中像 Release 一样被内联,所以这不太可能是这里的问题。
        • 同意,除非是#if RELEASE 或类似情况。
        • 我不这么认为;发布编译器/优化可以将模板代码折叠在一起几乎没有。这是一个巨大的尺寸差异。
        【解决方案7】:

        有一件事可以解释这种大小:在发布版本中嵌入的调试符号(而不是作为 pdb 构建的)。您确定没有为您的发布版本生成调试符号吗? (您使用的是哪个 Visual c++?)

        【讨论】:

        • 2008. PDB/调试信息是我计划仔细研究的一个领域......我通常会为发布和调试生成 PDB,但这应该是一个单独的文件。
        • 好的。如果使用 pch 文件,罪魁祸首可能是 /Z7 和/或 /Yd。您可能希望提供您在命令行上使用的所有选项。
        猜你喜欢
        • 2018-02-27
        • 2017-01-30
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 2011-03-26
        相关资源
        最近更新 更多