DEBUG模式与RELEASE模式

PcrazyC 2007-11-19 09:17:21
下面是我写的一个程序(控制台应用程序工程),在DEBUG模式下编译运行没有问题,但改成RELEASE模式下编译出现两个错误,错误信息如下:

--------------------Configuration: dfse - Win32 Release--------------------
Linking...
gg.obj : error LNK2001: unresolved external symbol __imp__mciSendStringA@16
Release/dfse.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

dfse.exe - 2 error(s), 0 warning(s)



#include<afx.h>
#include<stdio.h>
#include<mmsystem.h>


LRESULT CALLBACK MyProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);



void ctrl_cdrom_door(
LPCTSTR drivename ,//驱动器的名字如f:等.
bool fOpen//弹出时用true,弹入时用false
)
{
TCHAR devstr[128],ctrlstr[128];
wsprintf(devstr,"open %s type cdaudio alias mycd wait",drivename);
wsprintf(ctrlstr,"set mycd door %s wait",fOpen?"open":"closed");
mciSendString(devstr,NULL,0,NULL);
mciSendString(ctrlstr,NULL,0,NULL);
mciSendString("close mycd wait",NULL,0,NULL);
}

int main()
{
// TODO: Add your control notification handler code here
int i,cdnum=0;
char str[3];
for(i=0;i<15;i++)
{
str[0]='A'+i;
str[1]=':';
str[2]='\0';
if(DRIVE_CDROM==GetDriveType(str))
cdnum++;
if(cdnum==1)
{
ctrl_cdrom_door(str,true); //打开光驱
break;
}
}
return 0;
}


不知道是哪个地方的问题,望指点,另外能不能说说DEBUG模式与RELEASE模式在哪些方面有差别
...全文
229 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingbaozhushu 2012-07-21
  • 打赏
  • 举报
回复
遇到同样问题,谢谢指导
yyj4968 2010-07-26
  • 打赏
  • 举报
回复
这个已经解决!!
PcrazyC 2007-11-20
  • 打赏
  • 举报
回复
我穷啊,还接分

说两点给你几分
lllxy 2007-11-20
  • 打赏
  • 举报
回复
接分
PcrazyC 2007-11-19
  • 打赏
  • 举报
回复
我搜了一下,找到了部分,分享一下,如果各位还有补充的发个帖分享一下经验

在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:


1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧

2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (注2)

3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。

4. ASSERT, VERIFY, TRACE..........调试宏
这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为"#define ASSERT(f) ((void)0)"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。VERIFY是个例外,"#define VERIFY(f) ((void)(f))",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。


总结:
Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个避免的方面,即使没有这种问题也应注意一下:

1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。


参考地址:http://blog.csdn.net/zx_sanjin/archive/2003/02/24/12530.aspx
PcrazyC 2007-11-19
  • 打赏
  • 举报
回复
哦,好像是这个问题,那能不能说一下DEBUG模式与RELEASE模式在哪些方面有差别?
凤矶 2007-11-19
  • 打赏
  • 举报
回复
winmm.lib //要这个
-------------
RELEASE的工程设置中没有加这个
课程简介:本课程主要是跟各位小伙伴分享、介绍并实战两大核心的用户身份认证(接口鉴权)模式,即基于Token的认证模式 以及 基于Session的认证模式,其中 (1)   基于Token的认证模式 则主要介绍了三种核心、主流的认证模式,即基于Token+数据库、基于Token+缓存中间件Redis、基于Token+JWT的认证模式。 (2)   基于Session的认证模式 也主要介绍了三种核心、主流的认证模式,即基于原生Spring Session以及Session共享的认证模式、基于Shiro Session的认证模式、基于Shiro + Redis 的Session共享认证模式 即课程的整体介绍如下图所示: 核心技术栈列表:值得介绍的是,本课程在技术栈层面涵盖了“用户身份认证”、“接口鉴权”等业务场景常用的大部分技术,包括Spring Boot2.x、Spring MVC、Mybatis、加密解密算法AES、雪花算法Snowflake、统一验参工具ValidatorUtil、JWT(Json Web Token)、缓存中间件Redis、Shiro(身份认证与会话等等)、过滤器Filter、拦截器Interceptor、热部署插件Devtools、等等,如下图所示 值得一提的是,本课程所介绍的核心重点在于“仅仅围绕基于Token的认证模式”进行展开讲解与实战,如下图所示为Debug亲自罗列、归纳出来的几大核心要点(面试官就经常喜欢这样面): 如下图所示为 基于Token认证模式 总体上的时序图:

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧