背景
以前在网上查资料的时候,无意中开发别人出现过这样的一个问题:“程序在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)”进行测试。
测试发现,更改为“多线程调试 (/MTd)”的时候,生成的程序,可以正常运行了。一下子便把我惊呆了。因为“/MTd”中,MT表示“Multithread, Static Version”,d表示“Debug”。程序是Release模式,便一开始选择了“/MT”去编译。
现在看到设置为“多线程调试 (/MTd)”的时候,程序正常,我想可能是因为第三方库在Release模式下编译的时候,设置的可能是“多线程调试 (/MTd)”。
总结
既然程序通了,我也没有继续深究下去了。所以,如果以后大家遇到相类似的情况,可以先把“运行库”中的设置依次选择,测试一遍看看再说。
| 创作时间 | 2023.04.26 | | :----- | :--------- | | 最近修改时间 | 2023.04.26 |