« 上当了,空间服务器商放我鸽子« »驳X每个目录都梆定一个域名的超级猛的高招 »
解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”

VC.net2005写的程序如何在没有.Net FrameWork的机器上运行 --解决"由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题"

最近在公司的主要工作是做一个桌面程序,提供给公司正在为移动做的项目使用.我开始时是用C#写的程序,后来,公司要求,不安装.net framwork 2.0, 要求我改成C++的.所以后来改成VC2005和程序.原来以为可以不用安装,附带几个DLL库就可以运行程序了,哪知道,开始时,在别的电脑上都不能运行,一运行就报错,在XP如的错误如下图:

在XP上运行时报错


在2000上也会报错,不过,他会提示:因为少了XXX DLL,程序无法启动,于是我找到所以提示缺少的DLL放到程序目录下,2000下就可以运行了.可是在XP上还是不行,还是会报上面那个错误,我猜肯定是少了哪个DLL,可是找不出来,同事们也用了好多方法帮我找程序用到的DLL,也用到了不少的好工具,也找出了好多DLL,这些DLL加到一起,有10几M那么多(如下图).可是XP下还是不行.看来找DLL是没办法了.到网上找找办法吧.

所有在编译过程中提到的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的方法生成的程序大小属性

不过比起那么多的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

 


Tags: VC   |

原创文章如转载,请注明:转载自:巴士飞扬-技术BLOG : http://www.busfly.net/

本文链接地址:http://www.busfly.net/post/5.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:
  • 引用此留言  18.HBY  
  • 我用的C++6.0英文版的,也遇到了和HYY一样的问题,请问怎么设置了.因为英文版和中文版的有些地方不好理解的.
  • [删除]2008-4-26 19:15:31 回复该留言
  • 引用此留言  17.hanni  
  • 我的也是同样的问题。
    搜到mspdb60.dll后再复制到叫Bin的文件夹里就好了。
  • [删除]2008-3-30 10:14:47 回复该留言
  • 引用此留言  14.巴士飞扬  
  • 第一个方法确实不好,我是使用第三个方法的~~~
    方法三:

    工程-》属性-》配置属性-》常规-》MFC的使用,选择"在静态库中使用mfc"
    这样生成的exe文件应该就可以在其他机器上跑了。

  • [删除]2008-3-12 19:34:46 回复该留言
  • 引用此留言  12.小王  
  • 还是不行,按第一种方法把四个DLL文件复制到软件安装目录或SYSTEM32目录下,还是不行
  • [删除]2008-3-12 17:13:59 回复该留言
  • 引用此留言  10.七颗星  
  • 工程-》属性-》配置属性-》常规-》MFC的使用,选择"在静态库中使用mfc"
    这样生成的exe文件应该就可以在其他机器上跑了。

    这种方法应该是可以的啊,如果你在程序里自己引用了其它的DLL,那就要把你引用到的DLL复制到你的程序目录下.


    这个方法不好使
    巴士飞扬 于 2008-2-15 0:47:26 回复
    那你认为如何才好使呢Nothing_to_say
  • [删除]2008-2-14 21:44:42 回复该留言
  • 引用此留言  6.舍瓦归来  
  • 恩...微软的升级补丁里面为什么不升级一下VC的DLL呢...

    XP里收录的还都是VC6的...弄得用VC8写的东西都运行不了..

    VISTA的好像是8咯~
  • [删除]2008-1-29 1:42:24 回复该留言
  • 引用此留言  5.乖乖公主  
  • 我是用VC++6.0的,出现的错误也是在编译时总显示:“没有找到mspdb60.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。” (而且明明有mspdb60.dll)
    想试一下这个方法的,可是工程下面没有属性啊,只有从属性,我试过进入工程->设置->常规:
    使用MFC作为静态链接库,可是还是没有解决掉问题!相当郁闷啊~~~楼主帮帮忙啊
    巴士飞扬 于 2007-11-29 9:35:34 回复
    可能是那个DLL库没有注册吧,我用VC6没碰到这个问题,而且已经N年没用过VC6了
  • [删除]2007-11-29 9:35:34 回复该留言
  • 引用此留言  3.hyy  
  • 我是用VC++6.0的,出现的错误也是在编译时总显示:“没有找到mspdb60.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。” (而且明明有mspdb60.dll)
    想试一下这个方法的,可是工程下面没有属性啊,只有从属性,我试过进入工程->设置->常规:
    使用MFC作为静态链接库,可是还是没有解决掉问题!相当郁闷啊~~~楼主帮帮忙啊!
  • [删除]2007-10-16 22:14:01 回复该留言
  • 引用此留言  2.will  
  • 我用VC6,楼主的方法不能解决我的问题啊
    郁闷
    巴士飞扬 于 2007-9-28 9:49:42 回复
    工程-》属性-》配置属性-》常规-》MFC的使用,选择"在静态库中使用mfc"
    这样生成的exe文件应该就可以在其他机器上跑了。

    这种方法应该是可以的啊,如果你在程序里自己引用了其它的DLL,那就要把你引用到的DLL复制到你的程序目录下.
  • [删除]2007-9-28 9:49:42 回复该留言




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
网站分类
分类最近文章
最近发表
最新评论及回复
最近留言
热文排行
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(J2EE为主):3769186.