VC2005程序在XP下出错的解决方法

来源:互联网 发布:windows搭建ssh服务器 编辑:程序博客网 时间:2024/04/29 10:11
  <script type="text/javascript"><!--google_ad_client = "pub-6376451724654507";google_ad_width = 250;google_ad_height = 250;google_ad_format = "250x250_as";google_ad_type = "text_image";google_ad_channel = "";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "000000";google_color_text = "000000";google_color_url = "008000";//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6376451724654507&amp;dt=1177491990125&amp;lmt=1175248842&amp;prev_fmts=300x250_as&amp;format=250x250_as&amp;output=html&amp;url=http%3A%2F%2Fwww.hackhome.com%2F2006%2F4-10%2F17210827426.shtml&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=000000&amp;color_url=008000&amp;color_border=FFFFFF&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26rls%3Dcom.microsoft%253Azh-cn%253AIE-SearchBox%26rlz%3D1I7XNLA%26q%3D%2522%25E7%2594%25B1%25E4%25BA%258E%25E5%25BA%2594%25E7%2594%25A8%25E7%25A8%258B%25E5%25BA%258F%25E9%2585%258D%25E7%25BD%25AE%25E4%25B8%258D%25E6%25AD%25A3%25E7%25A1%25AE%2522%26meta%3D&amp;cc=406&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="250" scrolling="no" height="250" allowtransparency="allowtransparency"></iframe>

 

作者:代码罐头


这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时
问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"
这个问题似乎许多人遇见过.在CSDN和微软社区里面都有人提到.但是没有完整的解决方案
这个问题的解决一共会遇见2个子问题

最早出现这个错误我和许多人认为的一样
认为是缺乏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/lib/libcpmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/nafxcw.lib:
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/libcmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/kernel32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/user32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/gdi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/msimg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comdlg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/winspool.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/advapi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shell32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comctl32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shlwapi.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/uuid.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oledlg.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ole32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleaut32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/urlmon.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/OLDNAMES.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/atls.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ws2_32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/mswsock.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleacc.lib:
  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/lib/libcpmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/nafxcw.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/libcmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/kernel32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/user32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/gdi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/msimg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comdlg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/winspool.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/advapi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shell32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comctl32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shlwapi.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/uuid.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oledlg.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ole32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleaut32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/urlmon.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/OLDNAMES.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/atls.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ws2_32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/mswsock.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleacc.lib:
  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/lib/libcpmt.lib:
Finished searching libraries
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/lib/libcpmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/nafxcw.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/libcmt.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/kernel32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/user32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/gdi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/msimg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comdlg32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/winspool.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/advapi32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shell32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/comctl32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/shlwapi.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/uuid.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oledlg.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ole32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleaut32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/urlmon.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/lib/OLDNAMES.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/lib/atls.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/ws2_32.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/mswsock.lib:
  Searching d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/lib/oleacc.lib:
  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/lib/libcpmt.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.li
原创粉丝点击