程序在Debug模式下运行正常而在Release模式下运行出错的解决方案

C++ 同时被 2 个专栏收录
28 篇文章 0 订阅
31 篇文章 1 订阅

背景

以前在网上查资料的时候,无意中开发别人出现过这样的一个问题:“程序在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)”。

总结

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

参考

  • 0
    点赞
  • 1
    评论
  • 15
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论1
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页

打赏作者

CTA定量交易策略

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值