天天看点

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

文章目录

  • 环境安装
  • 工程项目设置
    • 控制台程序和DLL程序的编译设置
      • 1 设置兼容XP
      • 2 选择运行库
    • MFC程序的编译设置
  • 关于Debug和Release的提示
    • 过程分析
    • 解决方式

环境安装

环境安装

工程项目设置

控制台程序和DLL程序的编译设置

打开项目工程之后,右击项目工程,选中并单击“属性”,打开属性页。属性页界面如图所示。

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

1 设置兼容XP

在“平台工具集”里选择“Visual Studio 2015 - Windows XP (v140xp)”,即带有“Windows XP (v140xp)”字样的选项,这表示程序兼容XP系统,它可以在XP系统下正常运行。设置兼容XP系统的界面如下所示。

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

2 选择运行库

继续上面的操作,单击左侧“C/C++”前面的三角形标号,展开选项;然后,单击“代码生成”选项,这时便可以在右侧页面看到“运行库”的默认值是“MDd”。如果此时你的项目是Debug模式的,则选择“MTd”;若是Release模式的,则选择“MT”。其中MT是“Multithread, Static Version”的缩写,即多线程静态版本;d是“Debug”的缩写,即Debug模式。运行库的设置界面如下图所示。

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

根据上面两步操作——设置兼容XP系统和静态编译运行库,编译出来的控制台程序和DLL程序就能直接在Windows系统上加载运行了。

MFC程序的编译设置

对于MFC程序,还需要额外的操作。

在 “MFC的使用” 选项中设置 “在静态库中使用MFC”,这样根据上面两步操作——设置兼容XP系统和静态编译运行库,编译出来的控制台程序和DLL程序就能直接在Windows系统上加载运行了。

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

关于Debug和Release的提示

“程序在Debug模式下运行正常,而在Release模式下运行却出错。” 的问题总结。

过程分析

在VS开发环境中,Debug模式和Release模式并没有本质上的区别,它们编译使用的都是同一份源码,这是众所周知的。

其中,Debug通常称为调试版本。通过一系列编译选项的配合,编译结果通常包含调试信息,而且不进行任何优化,这为开发人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的。一般,客户不允许在发布版本上进行调试,所以它不保存调试信息,同时,它往往进行各种优化,以期达到代码量最小和速度最优,为用户的使用提供便利。

Debug模式和Release模式的唯一区别,就是在VS开发环境里编译选项的区别。在明确了这一点之后,就不得不重新思考程序的编译设置了。

首先,程序在Debug模式下正常运行,所以,代码肯定是没有问题的,这排除了代码有问题的假设。

然而,程序在Release模式下编译通过,运行却出错了。通过上面的介绍,我们知道Debug模式和Release模式只是编译选项的区别,所以确定出错是由一些编译设置的问题导致的。

考虑到程序里面可能使用到了开源的第三方库,而且第三方库也是自己编译出来的。在Release模式下出错的位置,也是在执行第三方库代码时候报错的位置。这样一来,便确定了出错原因:在调用第三方库时,Debug模式和Release模式的编译选项和第三方库的编译选项可能没有对应,这很有可能就是运行库的设置问题。

解决方式

在Release模式下,打开项目工程的属性页后,展开“C/C++”,单击“代码生成”,更改“运行库”里的选项,依次更改为“多线程(/MT)”“多线程调试(/MTd)”“多线程DLL(/MD)”“多线程调试DLL(/MDd)”进行测试。

Windows下VS开发环境环境安装工程项目设置关于Debug和Release的提示

经测试发现,在更改为“多线程调试(/MTd)”的时候,生成的程序可以正常运行,问题得以解决。正如之前所介绍的,在“/MTd”中,MT表示“Multithread, Static Version”,d表示“Debug”。该程序是在Release模式下,一开始便选择了“/MT”去编译。设置为“多线程调试(/MTd)”的时候,程序正常,原因是第三方库在Release模式下编译的时候,运行库设置为“多线程调试(/MTd)”,从而导致这个问题的产生。