在用VS2005学习C++调试程序的时候,按F5键,总提示这个问题,

不晓得什么原因,网上有的说找到MFC80.DLL复制到程序目录中,也有的说复制到安装目录中,可结果很失望,也有的VS2005安装有问题,系统有问题等等。最后还是用以下方法解决了:

在“启动调试F5”的工具图标右侧有一栏“解决方案配置”,将其中的“Debug”改为“Release”,

F5通过,运行正常,项目目录下生成“Release”文件夹,Debug方式生成的“Debug"文件夹是无用的。原因:

DEBUG和RELEASE 版本差异及调试相关问题:
  I. 内存分配问题

1. 变量未初始化。下面的程序在debug中运行的很好。

thing * search(thing * something)
        BOOL found;
        for(int i = 0; i < whatever.GetSize(); i++)
          {
          if(whatever[i]->field == something->field)
             { /* found it */
              found = TRUE;
              break;
             } /* found it */
           }
    if(found)
             return whatever[i];
    else
             return NULL;
  而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。

2.数据溢出的问题
        如:char buffer[10];
             int counter;
       lstrcpy(buffer, "abcdefghik");

在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
  3.DEBUG版和RELEASE版的内存分配方式是不同的。如果你在DEBUG版中申请   ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配),而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。

II.ASSERT和VERIFY

1.ASSERT在Release版本中是不会被编译的。

ASSERT宏是这样定义的

#ifdef _DEBUG
        #define ASSERT(x) if( (x) == 0) report_assert_failure()
        #else
        #define ASSERT(x)
        #endif
        实际上复杂一些,但无关紧要。假如你在这些语句中加了程序中必须要有的代码
  比如

ASSERT(pNewObj = new CMyClass);

pNewObj->MyFunction();

这种时候Release版本中的pNewObj不会分配到空间

所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY :

#ifdef _DEBUG
        #define VERIFY(x) if( (x) == 0) report_assert_failure()
 
 
  #else

#define VERIFY(x) (x)
        #endif
  这样的话,代码在release版中就可以执行了。

III.参数问题:

自定义消息的处理函数,必须定义如下:

afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

返回值必须是HRESULT型,否则Debug会过,而Release出错

IV.内存分配

保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。

V.DLL的灾难

人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。如果你的程序使用你自己的DLL时请注意:

1.不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。解决办法是将debug和release的程序分别放在主程序的debug和release目录下
  2.千万不要以为静态连接库会解决问题,那只会使情况更糟糕。

VI.RELEASE板中的调试:

1.将ASSERT() 改为 VERIFY() 。找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。请认真检查那些在RELEASE中需要的代码是否并没有被便宜。

2.变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。

3.是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.

VII.将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/debug_release.htm

1.此外对RELEASE版本的软件也可以进行调试,请做如下改动:

在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database"。在 "Link"项目下选中"Generate Debug Info"检查框。"Rebuild All" 如此做法会产生的一些限制:无法获得在MFC DLL中的变量的值。必须对该软件所使用的所有DLL工程都进行改动。

另:

MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的"Maximize Speed"优化选项并未被完全支持,因此这将会引起内存错误并导致程序崩溃。

2.www.sysinternals.com有一个程序DebugView,用来捕捉OutputDebugString的输出,运行起来后(估计是自设为system debugger)就可以观看所有程序的OutputDebugString的输出。此后,你可以脱离VC来运行你的程序并观看调试信息。

3.有一个叫Gimpel Lint的静态代码检查工具,据说比较好用。http://www.gimpel.com/ 不过要化$的。

转载于:https://www.cnblogs.com/greatverve/archive/2011/02/15/MFC80D_DLL.html

没有找到MFC80D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复问题。...相关推荐

  1. vc2005编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决

    vc2005编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决 收藏 快毕业了,为了工作的需要,需要使用庞大的VS2 ...

  2. C++编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决...

    今天本人用vs2005 sp1中文版,学习C++程序的过程中,在执行MFC程序时,在编译过程中出现如下问题: 相关问题:这里编译时可能出现以下问题 /************************* ...

  3. “由于应用程序配置不正确,程序未能启动”--原因及解决方法

    问题描述: 当运行由VC 2005 编译的程序时,出现错误消息"由于应用程序配置不正确,程序未能启动.重新安装应用程序可能会纠正这个错误" 解决方法: 在目标机器安装VCRedis ...

  4. 由于应用程序配置不正确,程序未能启动”--原因及解决方法

    由于应用程序配置不正确,程序未能启动"--原因及解决方法 http://moogge.spaces.live.com/blog/cns!ab9b00d806d52aed!245.entry ...

  5. [转]不知道能否解决先转下来再说不显示删除回复显示所有回复显示星级回复显示得分回复 没有找到MSVR90D.dll因此这个应用程序未能启动...

    本来一个项目运行得好好的,我重新生成了一下,结果再运行就出现错误,"没有找到mfc42d.dll,因此这个应用程序未能启动".我从网上下了mfc42d.dll,放到system32 ...

  6. [转]没有找到 MFC42D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。解决方法!...

    今天搞了个程序,写好了,打包给朋友测试,朋友说打不开,提示:没有找到 MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题,的错误提示,找了半天也没找到解决方案.还是去百度 ...

  7. 没有找到MSVCP80D.dll,因此这个应用程序未能启动。重新安装应用程序...

    为什么80%的码农都做不了架构师?>>>    在VS 2005中建立Win32工程时(以VS 2005中文版为例),你可能会遇到这样的运行错误:"没有找到MSVCP80D ...

  8. dll文件加载运行加载的14001错误,由于应用程序配置不正确,应用程序未能启动

    最近在处理项目问题的的时候发现了这么一个问题,就是我们的程序在调用第三方提供的dll文件的时候在一台机器上面会报14001的错误,但是在另一台机器上面不会.两台机器上面的操作系统是相同的.针对这个问题 ...

  9. 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题

    我们用 VS 2005 编写非托管的程序, 在一台未安装 .net 开发环境的机器上运行会出现 "由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题". ...

  10. 解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”...

    [VS2005]解决"由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题" 今天在准备发布用VS2005写的那个程序时,拷贝到我同事机器上,双击突然出现 ...

最新文章

  1. React事件系统整理
  2. Hibernate4一对一关系映射(共享主键方式)
  3. [译] 基于事件流构建的服务
  4. 程序员大神用 React “复刻”实现了一个 Windows 11
  5. 使用Tornado实现Ajax请求
  6. 小米手机连接不上网络 或者 暂时关闭状况不佳的连接
  7. 蔚来2018年平均每天亏掉2641万,车辆交付预期环比腰斩
  8. C++初始化,之不明白篇 coutxendl 与 coutx = coutxendl的输出的值会不一样...
  9. 2.2. 全国各地ISP IP表
  10. 学习 灰色2017.12.08
  11. [BZOJ 4010] 菜肴制作
  12. jfinal解决跨域(eova和jfinal)
  13. 互联网服务器使用ipset 和iptables禁止国外IP访问
  14. Steam游戏存档位置大全
  15. matlab画图不显示中文_如何解决 Matlab 画图时中文显示乱码的问题?
  16. 阿里面试:设计一个电商平台积分兑换系统!
  17. LVGL官方文档-7.11.0-8-Porting-Logging
  18. 【读书笔记】——【学习之道】《如何学习:用更短的时间达到更加效果和更好成绩》
  19. 8个 Chatbot 框架介绍
  20. @Param注解的使用和解析

热门文章

  1. UVa455 Periodic Strings(kmp)
  2. redis中的zset
  3. C++读写EXCEL文件方式比较 .
  4. 进程通信学习笔记(System V消息队列)
  5. Button的使用(三):处理点击事件
  6. 题目1168:字符串的查找删除
  7. 丢失控制文件,有旧的备份控制文件,之后有drop表空间和create表空间的操作恢复。...
  8. Java爬虫——网易云热评爬取
  9. Play-With-Docker在chrome上的插件
  10. P1288 取数游戏II