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

解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题” 有两种情况: 1:本机没有安装vc2005,但启动使用vc2005编译的程序是报错 2:本机上安装有vc2005,但是调试程序时仍报错,而发布realease版本的程序不会报错。 大多数网上讨论的都是第一个问题。 第一篇资料: VC.net2005写的程序如何在没有.Net FrameWork的机器上运行 --解决"由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题" 最近在公司的主要工作是做一个桌面程序,提供给公司正在为移动做的项目使用.我开始时是用C#写的程序,后来,公司要求,不安装.net framwork 2.0, 要求我改成C++的.所以后来改成VC2005和程序.原来以为可以不用安装,附带几个DLL库就可以运行程序了,哪知道,开始时,在别的电脑上都不能运行,一运行就报错,在XP如的错误如下图: 在2000上也会报错,不过,他会提示:因为少了XXX DLL,程序无法启动,于是我找到所以提示缺少的DLL放到程序目录下,2000下就可以运行了.可是在XP上还是不行,还是会报上面那个错误,我猜肯定是少了哪个DLL,可是找不出来,同事们也用了好多方法帮我找程序用到的DLL,也用到了不少的好工具,也找出了好多DLL,这些DLL加到一起,有10几M那么多(如下图).可是XP下还是不行.看来找DLL是没办法了.到网上找找办法吧. 到百度里输入"由于应用程序的配置不正确",搜索一下,嘿嘿,还真不少,都是和我一样,VC2005写的程序,在2000下可以用,在XP,2003下不行,不过发现,都是有人问,没人回答,可怜的人啊,咋就和我一样不幸呢.继续找啊找啊,找到了,找到一个人,提供了三个方法,摘下来,如下: 最近在VS2005下用C++写了一个Console程序,在一台未安装VS2005上运行,显示: "系统无法执行指定的程序" 原来用VC6和VS2003的话,是会提示缺少"**.dll",但是用VS2005却没有这样的提示。 用命令行方式运行,提示: "系统无法执行指定的程序" 直接双击运行,提示: "由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题" 自己实验了一下,感觉以下两种解决办法是比较方便的: 方法一: 在C:/Program Files/Microsoft Visual Studio 8/VC/redi st/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT 下找到了下列文件: msvcm80d.dll msvcp80d.dll msvcr80d.dll Microsoft.VC80.DebugCRT.manifest 把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以运行那个程序了。 其他release版,MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识! 方法二: 修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 方法三: 工程-》属性-》配置属性-》常规-》MFC的使用,选择"在静态库中使用mfc" 这样生成的exe文件应该就可以在其他机器上跑了。 方法四: 你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装 我逐一测试下来,直到第三个方法才成功.第二个方法不知道在哪里修改编译选项所以放弃了,第四个方法不喜欢,这跟直接安装.net framework 2.0 有什么区别吗?还不如直接安装.net framework 2.0 呢. 使用第三种方法,编译后,程序的文件会变大好多,因为其已经将使用到的DLL库静态编译到了程序里了.我这个程序原来的大小是288K,如图: 而采用第三种方法生成的程序却有2.85M那么大,如下图所示: 不过比起那么多的DLL来,这点大小不算什么.不过,在运行时,相信占用的内存应该会多一点. 如果你正在使用VC2005,也出现这样问题的话,就试试上面的方法吧. -------------------------------------------------------------------------------- 在网上看到别人的方法,和我的差不多,也贴上来,以便更多选择. 最早出现这个错误我和许多人认为的一样 认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后 都无法解决问题,最后确认不是由缺乏DLL所致 因为程序是纯win32的应用程,非托管代码,所以也无需.net framework Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的 而动态MFC库使用的是Multi-threaded DLL (/MD) 由于XP对于PE文件格式监测更加严格. 就会导致部分使用多线程DLL的可执行文件在调用的时候出错 修改项目属性的编译开关 Project->Property->configuration Properties->C/C++->Code Generation->Runtime Library 修改成Multi-threaded (/MT) 修改了Runtime类型以后 需要将MFC的编译类型也改成静态库 Project->Property->configuration Properties->General->Use of MFC 修改成Use MFC in a Static Library 一部分情况下在这步就能解决问题 另外一部分情况会遇见如下情况 编译器报错 CODE: nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj) [Copy to clipboard] 产生这个问题的原因是库依赖关系 在Project->Property->configuration Properties->Linker->Command Line 加入编译开关/verbose:lib可以显示详细的库链接顺序 CODE: ------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------ Linking... Searching libraries Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/pdh.lib: Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/DelayImp.lib: ................. Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/nafxcw.lib: Finished searching libraries ./Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found Build log was saved at "file://d:/Dev/Performance Monitor/Release/BuildLog.htm" PerfMonDemo - 2 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== [Copy to clipboard] 我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义 解决方法如下 Project->Property->configuration Properties->Linker->Input->Additional Dependencies 加入 nafxcw.lib libcpmt.lib Project->Property->configuration Properties->Linker->Input->Ignore Specific Library 加入 nafxcw.lib libcpmt.lib 这样链接程序就不会先按照默认顺序来连接这两个库文件 而是在最后在加入对他们的引用.这样就避免了这个问题 下面是一张可能发生冲突的列表 若要使用此运行时库 请忽略这些库 单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib 第二篇资料: 问题:我真怀疑用VC2005的人是不是都写ASP。NET或者C#的 只要用到C++发布程序的。应该一定会碰到manifest 网上关于manifest的文章只有一篇 问到别人关于这个问题 最多的就是让去看ms的文章 MS官方的trouble shooting http://msdn2.microsoft.com/en-us/library/ms235342.aspx 关键是我按照他写的作了还是没用 我用VC2005写了一个console程序 选择的是embed manifest 用的时DEBUG发布 manifest里面用到的assamble name是Microsoft.VC80.DebugCRT 照微软的说法 我把源机器上面的WINSXS里面的DEBUG CRT的dll和manifest复制出来 然后把manifest修改成Microsoft.VC80.DebugCRT.manifest 接着和生成的exe放在一个目录下 结果放到目标机上仍旧报错说应用程序配置错误 这里有没有人在其他机器上面运行成功过VC2005编写的程序(release不算。那个的manifest以及DLL在2003里面已经自带了。我需要是没有自带的使用manifest的dll) 答案:发布debug版本的解决方案说一下 2种 MS那个文档少写了重要步骤,想骂粗口 第一种。发布到winsxs目录的 把Manifests目录下面的x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c.manifest x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c目录下面的dll 以及关键东西Policies下面的相关文件 复制到目标机的winsxs目录下面 第二种 就是让dll放在exe目录一起发布。而不是放在windows目录下面的方法 .manifest修改成exe的manifest里面写的assambly name 比如用debug版本.在发布目录里面应该有个 .exe.embed.manifest 有如下段 name就是Microsoft.VC80.DebugCRT 把dll的manifest文件名修改成Microsoft.VC80.DebugCRT.manifest 然后把dll放到应用程序目录下面 最后要把policy目录仍旧复制到winsxs下面 这样才能运行 关键的policy MS的文档完全没有提到.而且一定要放在winsxs里面 这样所谓的private dll完全没意义了.因为我发布程序还是要写windows目录 真是想不到语言来评价MS的这种行为 完全放弃VC2005 这种的比较麻烦。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值