|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
0 X8 X% T/ x7 K+ M/ c! t; } 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
( T% X$ k5 e/ M6 Z r3 l Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:! }% N/ x0 y- i1 V# r/ ]
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
4 v$ b$ j9 {0 C2 W& R' y- T+ H# t1 \# i, A1 g" E- l
修改成Multi-threaded (/MT)
4 {- ]4 S+ Y* y3 J* b* E; |$ X3 X/ n0 E7 U. W$ Y4 M# }+ M! w9 G
修改了Runtime类型以后
; P: }. p) |$ ]7 l, R$ }; \6 c
需要将MFC的编译类型也改成静态库:2 C" ]9 A1 D+ z/ O& Y# e
Project-> roperty->configuration Properties->General->Use of MFC# ]! Q1 Z3 f3 R- s' w3 u$ r* [5 X
修改成Use MFC in a Static Library
r3 y% a2 G* }4 ~; e! M. D3 b
# i) p8 _3 Q$ X8 C4 A/ u' i一部分情况下在这步就能解决问题
; Q8 @8 T% w, e另外一部分情况会遇见如下情况 D0 d- a" d3 v2 E2 P( y& Q" o# k
9 K% \) T; q! R7 Z, w+ [编译器报错:
$ m6 e g+ c" s: O5 C: r. ~1 r* x1 o; n) t/ ^
CODE:2 c$ Z' K B0 x* F" r
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)% ]- n* D m. v, {
# y9 S/ }. ], U8 ]: E
产生这个问题的原因是库依赖关系:, X! A3 @% R* F
在Project-> roperty->configuration Properties->Linker->Command Line7 x' l( N7 h0 |/ }( G4 O2 l' Y4 R
加入编译开关/verbose:lib可以显示详细的库链接顺序
4 z* ]/ K3 k4 ~7 \5 V
; A/ X" _( Z1 [- Z# C8 w$ K" g cCODE:9 \" l4 i$ c6 w/ O- z" I/ z
" a2 R- ~- M5 q$ c- T7 a------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
* K ^! W8 p1 `) E2 K% bLinking...% J( c3 T& i+ O& h7 [) ^0 K# m
Searching libraries
( S& L+ [* j e `* CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 G0 B, j9 X+ T* g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:. Q2 }0 g% n- f; H2 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:4 n* r; n) k) O& q5 E; u3 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
* K& g# q5 \' G8 U- Fnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
, Z9 Z. R* [, XSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:$ W9 G: J( F: P0 D2 h/ _2 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:* N5 k* Z; j5 T5 `) V1 O2 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
1 `/ [; v* t v3 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
9 N! D1 V) r( e, a/ ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:' }' D. \8 b0 j3 k! p/ U) Y+ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
# H# x- r% w( b7 w5 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:, i, p2 A0 G) d3 ~& a5 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
" ~& ?, _/ S, F* z3 y' D5 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:. C" n ?6 I+ q& s7 X: N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
; F% m U: x$ {2 QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib: Q+ o4 B3 p$ Q, _8 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
: W. N, {" p4 g/ [9 Q4 H% m: mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
T5 A/ Y! e. A1 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:4 r) j! w9 { M% u; i# \. J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 T+ p( u" S. e" d3 U) n7 xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:, u' W2 m; ~ n4 Q ?2 D8 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:+ Z2 P2 L' D- ^9 T, X! A$ Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:: D3 |4 S* o/ @/ B5 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
. r( M" M8 w' XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:, D4 [6 e9 T# z9 x* Z# }' K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
; q- |$ }- j( a( R4 n3 x' B" dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
3 g" {# L' k( [" X$ E9 W; _Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
5 E5 x$ T* R! fSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
4 D: Y' v0 M8 L8 ~8 b7 C/ {% T& cSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 c0 ]8 d$ ]( _* N1 p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
% s& T# J) T, W3 b+ L6 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:) C* d! Q- {9 Q. Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
7 ?. Y8 I7 K0 D* v& L/ lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
) s6 u# v8 g/ b) KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:; V* I6 W. }/ p7 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:7 c: @% ?9 y7 X8 a( E" e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
7 l* l3 \! n5 b% \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:& B+ \) i1 v; R+ V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
3 ?. U, ^3 ~1 ^ bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:" H- }& f Q2 N. C' B! P! m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
U, a/ E8 Q Q: V! WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
$ F, \2 ?) W( eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:, s9 R7 @' V7 ^1 x8 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
4 W$ d0 U, x" _5 l& A+ X5 z' S7 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
! Q7 v4 r$ \8 z3 D! tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:. a2 O# ^' V0 z; S9 z0 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
1 L. t! Y8 P9 M8 u. L, A. M5 q/ xSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:9 t3 R6 d9 A, ]' F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:+ Z. \1 w n: m2 |1 E9 m% {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
7 ?, d6 W4 U2 ~6 d; }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:; ^8 h: y: K8 F% x) H4 Z8 _6 \. R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:$ h4 E1 a/ u- }9 `7 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* U* C/ P; K i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
& L2 _" }6 z! |! rFinished searching libraries
. Y k, A+ y0 ^/ c1 T( i' T) ESearching libraries5 g% ]2 n2 [( D) ~. V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
& R/ Y( J( |9 b) h3 M) mSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, k' D3 q9 J' f! I% u- A0 ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 L: `' [9 X# L" A3 D4 R& WSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
8 n& d1 E. d8 w1 n( MSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:* b, N7 ^8 y6 v8 w2 G4 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:4 c; s* ^+ C5 i5 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:: O" L: L3 y5 ^8 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:8 q9 c' J9 b# e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 f' _5 u d* e* F/ `3 C4 c' ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:3 b% l3 D) r# q* P* T# H4 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:& ]; Q1 y1 X4 t" t8 Z* v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
8 Y6 W' Z H4 B- Y+ ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:- b1 r" g( n4 z y& L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
& b# K3 Q+ [) r9 d k6 a5 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
( \0 I% c& z# e/ ]) f. v$ w' XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
- t) P4 u) k. Z( _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:) s' Z% h8 h1 K; W; S! p/ ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
4 k, T* T, z- s9 t( V9 u- o s8 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:3 h' m" \$ n4 q! J8 n; a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:5 i4 u, b$ S& a& F5 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
; q1 O4 h- C6 w4 B U8 r2 q. jSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
. }3 e5 w; M9 q) i1 ?9 _( D4 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:- g i( O8 e( i6 I( T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
' s- b2 \/ y* F/ [) F$ |: [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
8 S9 x0 }& k" P! i% aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
0 U8 ?0 R1 v& M& ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:' |9 N7 a: ]" z9 @6 v! A' c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
d: w; b- J. Q B* _Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
5 l# K8 _+ e$ O1 N" z) a) o6 b) x! ~- PFinished searching libraries" B& ^" ^* K* N! i
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
# O+ ]& s; h0 p( N( \Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"' b7 k+ o) H' i; e9 d6 D3 A
PerfMonDemo - 2 error(s), 0 warning(s)
1 z: @3 ^; N: z; K6 E; p4 ?========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
9 J8 f+ k: w* V
7 |5 o0 @! B8 t% u' p9 d+ Z K我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。& A) u- G$ k3 b* y" d4 s0 x
解决方法如下:) Y: S0 w- w6 q& R) [& b ]
Project->Property->configuration Properties->Linker->Input->Additional Dependencies! {* ]2 `( u6 w
加入( e; L# b3 u l& n2 E2 q* r. `. i1 g
nafxcw.lib
6 N* q5 {4 P% d& clibcpmt.lib' s( A j' O3 G3 e" ~9 u9 Z
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library! r) M7 u' c0 F% }4 \; |/ a. Z8 ]
加入6 a/ |/ g4 R$ z% U: e2 O3 U
nafxcw.lib' V3 W# ^# k2 ?3 w+ B3 e5 f, \) R
libcpmt.lib
) r/ F( U7 C* O+ X0 H r8 W( t( u0 }- Y
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
) e. ]$ j% y& c' ]
1 I0 P" m' D( X+ F9 i$ h- W单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 Y% H, X) @: `3 A" f
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
8 A. n9 [0 p& E. c' _使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
* F1 A( w: Q; g3 |: u: y调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 4 H5 C7 B/ V8 s6 ^
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
/ B; T; g7 e* v; l9 g使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|