目录
频道首页
VS编译设置(二)——程序在Debug模式下运行正常而在Release模式下运行出错的解决方案
收藏
0
YUNZAI 最近修改于 2023-04-26 14:26:47

背景

以前在网上查资料的时候,无意中开发别人出现过这样的一个问题:“程序在Debug模式下运行正常,而在Release模式下运行出错”。当时就下意识认为,这不可能,肯定是代码有改动了!但,当自己写的一个小程序出现了这个问题后,才开始正式这个问题。

现在把当时解决问题的一些思路总结下,分享给大家,希望大家少走弯路吧。

分析过程

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

其中,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。

而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

也就是说,Debug模式和Release模式上的区别,就是在VS开发环境里的编译选项的区别。在明确了这一点之后,就不得不回头重新思考自己的程序了。

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

  2. 然而,Release模式下,编译通过,运行却出错了。通过上面,我们知道Debug模式和Release模式只是编译选项的区别,所以会不会是一些编译设置的问题导致的。

  3. 突然恍然大悟,因为程序里面使用到了开源的第三方库,而且第三方库也是自己编译出来的。Release模式下出错的位置,也是在执行第三方库代码时候报错的。

于是,这样便确定了出错原因。调用第三方库时,Debug模式和Release模式的编译选项和第三方库的编译选项可能没有对应有关。而且,很有可能就是运行库的设置问题。

#解决过程

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

image.png

测试发现,更改为“多线程调试 (/MTd)”的时候,生成的程序,可以正常运行了。一下子便把我惊呆了。因为“/MTd”中,MT表示“Multithread, Static Version”,d表示“Debug”。程序是Release模式,便一开始选择了“/MT”去编译。

现在看到设置为“多线程调试 (/MTd)”的时候,程序正常,我想可能是因为第三方库在Release模式下编译的时候,设置的可能是“多线程调试 (/MTd)”。

总结

既然程序通了,我也没有继续深究下去了。所以,如果以后大家遇到相类似的情况,可以先把“运行库”中的设置依次选择,测试一遍看看再说。

| 创作时间 | 2023.04.26 | | :----- | :--------- | | 最近修改时间 | 2023.04.26 |

内容大纲
批注笔记
VS编译设置(二)——程序在Debug模式下运行正常而在Release模式下运行出错的解决方案
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
看板
留言墙