找回密码
 注册
查看: 5750|回复: 1

[收藏]VC++ 2005编译出程序在XP下执行出错的解决方法

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
' L" @3 ]- s+ g  ~$ s  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。/ @  p& N4 W0 A5 L
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
" c$ |8 T- P' |6 x' DProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library: E& |6 H. k7 B5 l+ [0 j9 r- h5 O
$ f9 I" F3 p; D- p
修改成Multi-threaded (/MT)
+ Y7 y0 H# |9 K6 |7 ^2 P
, `; M, y8 k- u- L修改了Runtime类型以后
* J  N8 J3 R2 s1 {) S- g3 e* R9 N0 j  l! Y" q
需要将MFC的编译类型也改成静态库:
( F) r# @/ g) u/ m  j8 i1 cProject-&gtroperty->configuration Properties->General->Use of MFC
) h9 W1 _0 y8 e. R6 E修改成Use MFC in a Static Library
+ _$ e8 b. G# Z. F+ ?, f% M* q/ O3 B$ h% |+ O( b5 k
一部分情况下在这步就能解决问题
, n9 x6 o) d. U3 g7 `2 B2 f( f' I- U7 A另外一部分情况会遇见如下情况* o0 ~5 {) A0 u

0 s/ z; Z: `& Q7 Y编译器报错:2 [* ~$ o) }8 G5 H
; j* L9 G3 d7 z: E4 j! a0 @
CODE:2 w% ^: q1 A) ]. V
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)9 i% R6 K+ `" K% q* w
# N+ K, ]: C) Z; w
产生这个问题的原因是库依赖关系:3 {1 B* ?: T% t. ]1 X# n0 j( z& Z( q
在Project-&gtroperty->configuration Properties->Linker->Command Line3 @7 A1 m3 G  d: o- I/ t
加入编译开关/verbose:lib可以显示详细的库链接顺序) `* Z7 Q- ~) B- K' B7 [
1 A& h6 d" M* _' G1 p$ O
CODE:
& n5 x& |* z+ t. n( W
- k" x1 H) |; |$ \- K' l  X# M. i------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
: }" N' z! `2 |8 @0 C0 [) _4 ]  pLinking...6 E/ ?5 ~' Z. \: A' q7 c
Searching libraries
) d3 E7 Y' \$ vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 I) u( I  I5 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:3 @# \5 M. y/ Q+ j; u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! m" F: v: p" @' i, OSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:4 S( J) o; B* V4 j* ~
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
1 l* Z" F+ C# S$ Q$ @Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:' j4 S* z$ s/ s& h; l4 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:& K6 Y- f0 q7 O9 F- V( b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:! m9 D6 M! Z2 ~$ t& ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:0 L' d$ u- V3 u( e' o& y, |8 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:  M0 L/ [' Y8 D5 v3 D( [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
- v: e; |9 P5 }8 d, g* H. n) _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
5 O, X5 g9 |% uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
' H8 I# L1 w7 y4 ~2 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:  I. L) X  M  o, ~! {; D# d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:% l% z% v  M' q9 [2 a: H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:4 e3 f8 d: q5 w( x( C" f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:. ?5 \- Q! C9 |5 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:/ p! K9 `$ _& Q2 v" o9 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:$ c7 P9 w4 s& [4 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
0 |4 y% }% R6 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
! {' ?* c) c# `- [' z8 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
, W( C$ ?0 M( f0 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:$ V4 j/ c" V* y: s2 s" c3 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
8 t8 G! m* m' g% g0 k; XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:5 S# \" O# |# s# w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:: S) b  x# Z9 M3 u" U# S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
' S  V+ x) M7 ~+ eSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; L6 o9 X  X) NSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
9 I  l" y& x8 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:! r$ O7 ?/ Y' e4 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
! Q- W3 a. b& Y& V: p1 r/ E8 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
! b. x9 d  m; \: a$ s" iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
( p: L3 R3 ~2 }2 X; R& bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
- n4 l: H& P) @3 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:0 L4 U' R: F  p% {: X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:. {8 u( t6 }- |1 ?/ r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:( s( }2 C8 H) T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ D9 k$ o# v$ E7 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:- X  v! _6 Z$ U  |- X' v3 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:; c$ S1 U% j4 P2 _, H9 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:) J: o. p: f9 S1 U9 X/ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
/ J# ]1 U6 L" YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:4 o5 W- ]3 n2 j$ i+ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:- L& }( |% C: X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
% U0 R; M  s( l6 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:- k7 \" h+ `! W* N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
& b" C5 S: _, d9 G, MSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:( C3 p1 S8 I% o4 f& }$ e  u. p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
. ^" U* L) d" WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
1 p7 J( y7 q1 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
* J( M3 `' ^. ]9 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:/ t% B3 D; b: f+ T- B+ C  Z0 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:; d+ ]  `4 q4 b" a) _. [6 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
$ k& r4 j7 N& N0 ^" BFinished searching libraries, s# J4 s, ?) y' f- n
Searching libraries+ \, O4 ?1 H- v- e/ w# o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
/ z! L! i5 O" G: }1 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
7 y1 ~2 p" G. c" F. _2 F; u" nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! \5 o' `3 |. D% LSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
+ p, D1 [5 i- B0 _" f- {7 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
& s$ W8 f! Y. L1 ]  Z+ HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:9 ?. q/ _  ~' A7 l+ r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:9 }, e) ]. m$ p0 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:9 Q3 g0 G: y' L  F- J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:% z' i, D# K' z9 r1 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
6 H/ x  U; v* hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
- J6 Y$ S1 ~" A% L' HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:- W' C& @$ d& X9 \8 y+ [1 ~; y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
6 T) G/ x6 P* |6 i/ Y( e: `* GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:2 a* P' c; U) S3 p! s9 o; }' q- r1 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:* ^+ F. M  a8 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:( N5 l8 O0 a; Z' g  d6 F' o) ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
1 {- |; g6 t% w' L9 _' Q& y. \. ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
8 R& X" S1 f9 W$ t6 o6 c3 ~# FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:* a* o( ~9 W; w1 d. I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:, p" s  U% e5 p. K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
: t, ]) l2 x$ R, Z* W+ Q! k% lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:- z- P1 ?6 n) |; T% H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:6 \& H$ ]2 u' C9 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:% ~" Y, L1 H6 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:2 S$ }! V& X, p, i2 n+ B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:8 \1 l/ ?0 ]1 Q: w3 _/ {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:# G+ R5 a% u( m# w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
8 ]0 v" B* x0 w3 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:8 \, q8 h4 ?2 p: K" J
Finished searching libraries" z: `0 D/ Z) ^; P9 O; D1 {
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
7 K% |8 a2 t1 }Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"0 f3 Y- s) ^7 `0 q/ W/ V) K- ~6 @: T
PerfMonDemo - 2 error(s), 0 warning(s)
% P5 r) E$ }6 d/ P========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
- ?) w+ o+ I# R  l* m" A. F' \
! B* o9 [0 U; o我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。! X1 z" e! Z* S6 k% G  r
解决方法如下:
# V$ Z7 T' G' Z3 Z; _+ h* C; UProject->Property->configuration Properties->Linker->Input->Additional Dependencies% P8 Z5 t, i2 ^, {3 E  l
加入* D# ?% d! r: z- F2 g" F
nafxcw.lib
1 G+ S, w* ?( slibcpmt.lib
+ E* _3 {7 W: V& t; t( ^) zProject->Property->configuration Properties->Linker->Input->Ignore Specific Library9 q! m5 T4 P8 X: W8 U7 o
加入
% M  ]/ t6 M# Z  pnafxcw.lib
! \' T" d2 v$ J( c7 Clibcpmt.lib& p: w$ E/ t, n0 ]  A- Y8 {7 ?% g$ s
% _9 l; o- {* O& g9 \
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
8 G, d: E8 a4 e- r4 T- ^: Q; g. R. ]( B6 Y4 R0 ^3 o2 V, s8 t; Q# u
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib % j9 X; d$ T! d. @, d, U& A
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
: M3 w5 e0 }) I使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib + M  t) D' X- y5 X  B
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib & e$ q+ `/ d( I! H
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
9 p; f0 q4 b# v- }4 O$ n使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
 楼主| 发表于 2006-11-14 15:23:38 | 显示全部楼层
msdn里面有解决的办法,在重新部署c++程序里面有说明,建议采用以下两种方式来重新发布 Visual C++ DLL。首先,可以使用 Visual C++ 可再发行的合并模块,将 Visual C++ 程序集安装为共享的并行程序集。; |( O' k/ A5 g4 t. I* q3 a
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
0 n- g- l0 \2 ]/ w# K就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。
, i2 w+ s4 V2 i. m; g( v楼主的方法容易误导初学者
) F4 v7 h3 ?7 [8 J( M9 n" {& o6 {9 M8 A- F3 T# E
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-10-1 20:49 , Processed in 0.019072 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表