|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:$ v2 c7 `/ D$ D( j: e& d
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
7 n8 ]4 a8 f/ T5 j" X A0 h Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
; s. S- l. _* P$ kProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library0 a$ K/ V, D* Z5 ~
1 N7 C) z, i) V" _8 c4 F
修改成Multi-threaded (/MT)
; a( D) c" k/ Z% B: Q4 b) h8 D3 b! {
修改了Runtime类型以后 k7 m) O& I7 N$ H. ]% J: h- r
6 h9 Q) v8 o2 J需要将MFC的编译类型也改成静态库:
# O) {# h0 k M) u% f, CProject-> roperty->configuration Properties->General->Use of MFC, Z( u) v& a1 b& s3 ^: R' [4 t/ X
修改成Use MFC in a Static Library, h0 c; C- _7 n5 r e& b
9 O: K6 y$ X9 p) D3 X) z
一部分情况下在这步就能解决问题
, N* A, }: S& L2 ~* r6 R' H& y另外一部分情况会遇见如下情况7 [& _0 _* Y5 n
' b" x% M; ~$ {0 r; _
编译器报错:& X0 E$ D) x( j0 ?5 N, P
% _2 D: p& h. H0 i! X) d1 H
CODE:
- w/ h Y5 T1 {3 N7 y& Q0 fnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
- h0 ~# J5 ^) [$ j; L6 D2 Y1 x/ p& \4 S0 F; q9 u* v) m
产生这个问题的原因是库依赖关系:
+ N( N6 d4 u9 T& U# m! z% D6 r在Project-> roperty->configuration Properties->Linker->Command Line
0 r# v9 M; a# s4 Q加入编译开关/verbose:lib可以显示详细的库链接顺序
- g6 @* z- I2 T% ?0 V' f H
) j: S5 h3 y: U9 `7 l- ^# vCODE:$ M0 X. z& S5 Q- `# G
$ J' B& Q- F, K) a* w------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------0 o, F- ~2 _' M4 I
Linking...0 ~! A& Y( ?& @ C' ]' G) C8 z1 \
Searching libraries
4 P+ c; |* j$ s/ H" \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:; j9 B. G$ x6 c2 X% e4 h( d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:3 M2 \; l/ e) {: V4 S0 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 ^& \! ?' R" ]2 L; K! _8 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
2 k( y5 `6 A/ x* d$ Q8 {3 Fnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
# U# r" r* G# C/ @. i5 b- X8 U+ Z; mSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
* v6 Q/ |# V% [* L3 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:" i! v& J, ^1 q; z/ F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
5 ]& }" b4 C8 b" Q, QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:6 \% ^- c8 S% P1 n; ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
5 m' `$ Y( i: U* b* VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:* z6 R9 k; w, X6 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
% E& J/ Y: G9 i9 r: p; h. Y- dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
2 g [, T4 z* Z- FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:* N: M4 L+ S2 H0 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
+ | V. H0 @ F U4 P) @- @1 R2 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" [+ }# B! n e# z+ W& ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:# ~8 H/ Q2 @0 u0 m& W7 K! {: M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
7 t" ? o9 U( r' O5 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
3 n' N+ A/ c* V0 k0 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
% I+ w! v: r, OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
! \0 |& j9 U/ [8 x! v2 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
# ~6 B; t: x! O4 ?) X" F2 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:' A7 s( r8 g- c1 p+ x0 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
1 K/ L0 K0 K+ Z* b. d1 O NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
; \. [( z# b, v; hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:- _1 U! _3 V# J$ g0 f) `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 Q2 \/ ^ S7 e" f5 K. ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
0 g t* j. A. Z$ r# ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
" L) k/ P$ V2 d. O MSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:. @/ x6 \8 ?; v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:- p0 x% W/ P5 @3 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:: g. M+ N% M5 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:3 c/ @ ]$ O9 x+ X: B5 K" @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:/ f5 V% `) {# P' Y6 l$ p5 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
3 q! X& p' I5 A3 V0 H, uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:9 O$ b- t" q2 R) J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
3 P" F! L/ E: sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
: r9 ~. L$ {5 u1 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
j2 f$ k& N+ c% q3 G' kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
7 G8 j8 \1 ^8 J) B" K2 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
$ P) c3 F( Q0 q c1 n/ c, d; {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
B* P% |$ _* ~% Q; H% gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:2 P" r, Q# ]% t. g4 `4 N8 _: l7 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
0 Z0 T2 \# _% b0 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:1 z7 R# ^9 m6 \3 M/ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
' p6 V- |) [4 A' q" YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
: Z; h6 W( h) |" ?( eSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# o4 q' @1 v" i1 |4 z; T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
+ g- E+ f- v7 Q, l" C; J1 P6 O pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
$ H; m3 b1 q' ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:% K3 k' F- l1 J0 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:8 i/ N! T. q; `2 V$ K9 X% ^( |8 U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:0 [4 S& P) a, z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:; K! o: ^* G7 t1 }
Finished searching libraries
$ q% A$ n6 ]$ c- g# y* I" b H+ p6 zSearching libraries
+ _3 |" L" s; P- k$ U. uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) X7 J: z0 s- }% }6 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; w; g3 T; }6 t0 q- u7 F. e! s0 \9 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:3 Q' }3 w. K0 @! l7 {+ E' i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:1 U) W( j& C1 c2 ]1 R: c1 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:, e) |" j! U8 c% q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:9 R8 p0 b X+ Z5 ]) X+ ~$ w7 ^# M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:5 Y, N2 e. X- D* N( Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
! K' w$ k! ~, D# G. W3 w- p: ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 P X9 H" H% O( YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
$ Y ~% N# B+ F. VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:: K0 w6 N; c6 u$ L9 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
; k& n+ E" J2 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
7 k! o3 n/ E/ k8 p( ~, q3 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:3 g1 y7 H, `9 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:/ z7 J) S8 T- L3 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:9 R5 a/ X$ r7 _. Y) i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:& D& f! ~& V4 P- H* t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:) T" c# ?# l4 ?% G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
: C5 E9 ?# Z3 a- h9 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib: R# B- I4 [* c( A2 L9 u9 a$ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:- x0 \. \% `+ B5 ]9 j# N$ b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# Q1 @# z3 C% R) u1 P0 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:; N& W. @) s# P- j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 U# B$ [, N) k' W% I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:) U1 V: a) m+ [/ l& G% U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:, B* D' b1 k9 w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:0 ^6 Q" S7 ~3 i" B9 t m+ w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:' f; ], G# K7 [" P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
* S" K9 E* u, z9 e! m- r( m' nFinished searching libraries
4 o# r, o1 Q9 ~1 {/ Z% A$ D2 X) w1 @2 u.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
4 x2 D) ~- l& ]2 l, _3 W: s1 ^7 n+ HBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
- W- Q2 A/ i/ RPerfMonDemo - 2 error(s), 0 warning(s)
$ B) E. p8 ^! `4 ~% X; h========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
- i2 N, v9 u$ X0 H+ @$ Q* W' K
4 C1 p8 M( K6 Q/ i2 o- a- y我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
, R0 H. ~; J+ @) I( W- V) |" {解决方法如下:+ F1 j2 c4 S1 `
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
1 G9 x# {: N9 e" T$ s- [$ t加入6 d, H/ i; k( P4 v1 y4 s
nafxcw.lib
% }& ` S9 I+ J% Wlibcpmt.lib
* ?; r* v9 a' e4 jProject->Property->configuration Properties->Linker->Input->Ignore Specific Library, ~/ W7 C4 B; J3 _! ~" ]/ H# P$ O' R
加入
1 b6 A7 `/ l3 Z" c# Znafxcw.lib# c7 \& P; |( z
libcpmt.lib" T6 [5 i0 ~7 W- q8 K
6 j( K# c* e4 H
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:- u2 s$ x$ R3 U9 `' A7 r/ K
) w+ ~2 }( `; X6 }
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 0 R! {' J6 ^- M/ k( `, x
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
`: _! h- H7 B% v8 Q使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 O3 n/ a8 V% \! d3 {! A- h1 y- h
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
* u0 E+ I, @% I调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib # S) J6 ~( ]0 K" V0 L
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|