gpt4 book ai didi

c++ - 从 Visual Studio 2008 升级到 Visual Studio 2013 时二进制大小增加 30%

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:16 29 4
gpt4 key购买 nike

我必须用多个项目维护一个庞大的旧代码库(不是我写的),其中大部分是 C++ 语言。我的第一步是将代码库从 VS 2008 升级到 VS 2013。

两种解决方案都设置为针对大小进行优化(在发布版本中)。然而,二进制文件的大小现在增加了大约 30%,几乎在所有二进制文件中都是如此——我很难解释这一点。

这些项目大量使用 ATL,而且我知道 ATL 9 已移至静态库,但我怀疑这能否解释所有大小差异。

任何想法:

  1. 大小差异的解释是什么?由于这种尺寸变化,VS12 是否更安全或具有更好的性能(寻找销售此开关的“关键点”)。

  2. 寻找减少二进制文件大小的方法,从容易实现的目标开始,到更精细的工作。

最佳答案

假设您静态链接 MFC:

解决方案

#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS

stdafx.h 的顶部,或将 _AFX_NO_MFC_CONTROLS_IN_DIALOGS 添加到项目设置中的预处理器定义中。

说明

MSVC 2010 包含大量新的扩展控件(其中大部分与功能区相关,还有 CMFCButton 和其他内容。还有一个 MSVC 2008 的功能包)。这些新控件可以像旧的 Windows 控件一样通过资源编辑器添加到对话框中。

为了完成这项工作,解析 RC 文件的代码1 需要知道所有新的 MFC 控件类。如果您动态链接 MFC,这不是问题,但如果您静态链接它们,则意味着 MFC 所有 Shiny 的新部分都链接到您的应用程序无论您是否使用它们。我因此有一个二元三元组的大小。

很快,事实证明这是一个比 Microsoft 人员想象的更严重的问题;静态链接 MFC 显然比他们预期的更常见。解决 MSVC 2010 中的问题 remains painful ,但在下一个版本中,引入了一种机制来禁用新功能:_AFX_NO_MFC_CONTROLS_IN_DIALOGS 预处理器宏。如果它是在包含任何 MFC header 之前定义的,则 RC 解析器代码不会处理新控件,并且不会引入对它们的依赖性。请注意,这意味着无法通过资源编辑器将新控件添加到对话框。

可以在 this MSDN blog post 中找到有关问题和解决方案的更详细的技术说明。 .

1是的,我在这里掩盖了一些细节。

关于c++ - 从 Visual Studio 2008 升级到 Visual Studio 2013 时二进制大小增加 30%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29743072/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com