Visual Studio 2005 - 使用 /DEBUG /OPT:REF 构建的二进制文件比非调试版本大得多

Posted

技术标签:

【中文标题】Visual Studio 2005 - 使用 /DEBUG /OPT:REF 构建的二进制文件比非调试版本大得多【英文标题】:Visual Studio 2005 - A binary built with /DEBUG /OPT:REF is much larger than non-debug-build 【发布时间】:2012-02-15 10:40:36 【问题描述】:

在我们的例子中,/DEBUG 二进制文件大 50%,使用 /DEBUG /OPT:REF 构建的二进制文件仍然大 40%。从Visual Studio: debug information in release build 的答案中,我预计带有调试信息的发布版本不应该大得多。我们缺少什么?

这是我们目前发布剥离的二进制文件而不是易于调试的二进制文件的主要原因之一。我不是构建大师,所以请多多包涵。

尺寸: 22MB 带 /O2 35MB 带 /O2 /DEBUG 32MB 带 /O2 /DEBUG /OPT:REF

【问题讨论】:

这确实属于“当然它更大!”和“你为什么要关心?”类别。代码没有优化,所以它当然更大。您还总是希望使用 /INCREMENTAL 链接器选项进行调试构建,以获得快速的链接时间,但更强大的图像。始终发布 Release 版本。 我也这么认为,直到 Michael Burr 证明相反。此外,我们甚至没有在发布版本上运行任何大小优化(没有调试信息)。我也不会关心 10 MB,但我的老板对小型二进制文件感到自豪。我想说服他,带有调试信息的发布版本几乎没有缺点。 【参考方案1】:

如果它是用 C++ 编写的,则 STD 在未优化时可以编译得更大。但我不确定是否是这样。那 50% 到底是多少字节?

【讨论】:

当你在没有优化的情况下编译时,不会自动内联函数(如果你有很多像STD那样的小函数,内联会减少代码大小),没有引用或指针别名,表达式执行为他们是写的。这些会产生更多的代码。 我们使用与发布版本 /O2 和 /Ob2 中相同的优化标志。所以我们追求的是速度,而不是大小。 其实我不知道 /DEBUG 会生成不同的二进制文件...你是在 IDE 中编译还是在控制台中编译? 为了比较我们在 IDE 中编译,构建是使用 nmake 自动生成的(我认为),但我认为如果使用相同的标志,则没有区别。 如果在 IDE 中使用 /DEBUG 标志进行编译会很奇怪。我相信链接 /DEBUG on 和基于发布配置的其他标志(默认发布配置也有 /DEBUG 标志)不会产生更大的二进制文件。它只是生成一个描述二进制文件的 .pdb 文件。【参考方案2】:

根据http://msdn.microsoft.com/en-us/library/xe4t6fc1(v=vs.80).aspx的VS2005文档:

/DEBUG 将 /OPT 选项的默认值从 REF 更改为 NOREF,并且 从 ICF 到 NOICF(因此,您需要明确指定 /OPT:REF 或 /OPT:ICF)。

因此,要减小大小,您可以尝试同时指定两者:

/O2 /DEBUG /OPT:REF /OPT:ICF

【讨论】:

【参考方案3】:

代码可能不会产生那么大的二进制文件。一些提示:

您是否使用静态库,而不是动态链接,特别是 MFC DLL? 拥有大量资源,即。图标、位图、字符串资源、自定义资源?

【讨论】:

Afaik 静态链接 Qt。我认为这在没有调试信息的发布可执行文件中构成了大约 10MB。 C 代码大约有 180 万行。 我不使用 QT,但我相信它在二进制级别不会那么大。

以上是关于Visual Studio 2005 - 使用 /DEBUG /OPT:REF 构建的二进制文件比非调试版本大得多的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2005 图像上 添加 数字

Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多

将crm 4插件项目从visual studio 2005升级到visual studio 2010

用visual studio 2005 的问题

Visual Studio 2005 C++ 编译器比 Visual Studio 6 编译器慢?

Visual Studio 2005 关闭缓慢