jjzjj

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

coder 2024-02-11 原文

我必须用多个项目维护一个庞大的旧代码库(不是我写的),其中大部分是 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/

有关c++ - 从 Visual Studio 2008 升级到 Visual Studio 2013 时二进制大小增加 30%的更多相关文章

  1. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  6. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  7. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

随机推荐