|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:" x6 q+ D! x6 { h# w
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
. n* L6 o" w+ O2 u: B1 c Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:- X2 t ^$ [$ f) S% n
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
, N5 o K! L2 n( k; i( _* a8 G' z( T$ o2 m
修改成Multi-threaded (/MT)" i3 p$ w9 X2 {% K1 p* {- |5 `* \
$ R. \% B m$ b! ~6 Y
修改了Runtime类型以后
$ k2 R+ E- Y; ~: O
) S: @7 {7 a9 M$ @& N# \需要将MFC的编译类型也改成静态库:3 U4 f0 T; J) J5 q3 v( G3 k9 H7 T
Project-> roperty->configuration Properties->General->Use of MFC! n1 V# K& `9 e% g* w9 J
修改成Use MFC in a Static Library
& M! x' l/ p+ F; d; N/ F
/ C/ D! w" y. t6 T( }' ?0 {一部分情况下在这步就能解决问题
4 L! ~& |9 F, {6 B) C% [另外一部分情况会遇见如下情况
7 p9 M3 m/ s6 }$ c) S( I- ?: d2 ]6 O) c, C. K; ?8 E7 t2 T
编译器报错:
1 `' @) i6 P: J( Q9 ?
5 C1 f7 E0 ~, h: o7 rCODE:
% E% |4 e' W0 `9 X. dnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
; p; A3 q* Q4 v* y8 R3 q
! V5 f- m8 k" Z9 x* e产生这个问题的原因是库依赖关系:1 C+ B G3 y; |3 [. V, Y
在Project-> roperty->configuration Properties->Linker->Command Line
& h7 o5 b, ?% i3 D. u/ q5 H, m8 t加入编译开关/verbose:lib可以显示详细的库链接顺序) f& n# v% t8 U5 H* {! D
- R1 ^# b4 z# f! p3 p5 _2 c' x
CODE:0 G3 q: a) X/ }/ T( E" ~
( l; D# a! ?" F; M. Z( C------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------+ K: s- N* I! E( z- R
Linking...+ f! _2 h4 I y/ U2 x
Searching libraries4 e! J' ]% D4 z6 O, U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:& S8 g" y$ C! o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:8 Q' `2 m+ Q4 Z; s. }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:% m4 _+ r. N$ R/ E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- K4 a- C7 f1 A% G7 _' N4 L
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
0 @8 N; ?4 Z r' J3 ?* ~# `" M( USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
1 J# t9 |7 ?- @% X" [$ i$ M1 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
# [$ F3 X; U( `( y [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
. I3 `5 y* ~2 s' V6 d |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
; _5 S, s: Y' o2 L3 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
3 `9 T; ]) n8 Y7 G# ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:. a, B+ `( G( d& F+ L* _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:# L, J# w+ y1 g; _$ D7 \1 N7 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ w4 a7 I+ H$ d% C* W `) P1 K' }' E5 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:6 E& r; Z: @, L4 `& ]! ~( f2 C5 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
1 Q3 a* |7 a4 i5 t8 t) hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:' `* ^0 j6 X1 y: z7 h u* t$ e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
1 ^" o. ^# {+ I) x jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
w4 y ~1 ]. }8 T& n( ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
1 p' ^1 v5 g0 m7 g, ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
: L) y% u' L! `. ?3 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
; }8 S# a+ \+ X5 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:+ b5 g* n0 G% y% }; g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
5 M" u% f& s9 x! G3 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:- @9 i* Y# V6 O" C" F9 `# |! ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:$ C0 w ?8 t5 z1 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:& Z4 \% g) Q8 r6 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:* d$ j# z2 ~) O" u4 t2 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 E5 H M" ^4 Q9 }2 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
; f; s# r" _4 `! |: C) `Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:) n4 T1 G) W' L( G* H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( Q# x1 n2 O( Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:# n8 m; b. w8 O7 r# C2 C& l; }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
5 I6 J( ~4 r1 k8 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:. z5 j# T! e k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:! y, x, X6 D$ _' X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:$ P: P# M# D; ~1 K9 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
: Y3 a, g- d* D; \' C: D$ H& V) X4 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:* j9 V$ }/ c: u) J F1 y- u7 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
- ?( P) X1 D8 [# z, NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
+ [ C; h* m. J7 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:8 W. |' D8 ^/ i: q) e/ Q$ F3 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
& U% d. s1 y# V- ]0 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:# N/ R2 l2 R @2 l( ?5 t5 z: Z) _# c6 }+ U/ u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
* U4 L$ f- M$ G8 H- |3 U \# zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
8 @7 [" I, q' T2 _3 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:- v8 }+ M8 a2 x$ w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
1 K8 f) B- ^0 F5 I6 I* SSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
+ E4 C+ M% k% USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
: @3 w% m0 u7 h6 Q: zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
0 j: j$ C2 b6 H9 X: v2 j6 W- \' }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
$ n( Q' I3 N6 F) U% BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' a: |% U, P% p y& Q3 p h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
/ w# o" f* X, [; I% f8 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ b2 b3 G) B. O" F7 P8 |, uFinished searching libraries
+ `5 M; a' }: dSearching libraries* ^4 x2 j" _* H. D5 r7 t9 [8 w/ R" F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 Y% S0 d0 `- |+ M1 A9 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:9 D, o2 L$ M" j6 \0 k) h: H4 I2 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:& S" R' o$ D+ }0 z' z5 A+ J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:( f: o5 t' W9 I2 Q# f2 w0 z1 G( k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
: B$ J6 C( z) A# ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:1 [3 N; E, l0 u/ C) D- z; B" S& z- W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
& ]0 W+ r8 Q1 [: L* Z; k) _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
8 f6 D: A0 K# C# P4 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:( v+ Q# ~& W6 ?+ ~& a5 F# @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:. s ~5 f' L' L) m8 {( y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
2 Q' g" m6 o& p9 f, HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
8 R* x# J1 @6 a6 F& R1 V0 {0 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
: @4 c/ Y2 ?) oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:! r% Z( L3 Z8 m+ c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
. y6 D3 n( h8 ~5 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:" o, r3 O" G2 k8 S! L8 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:4 n5 F+ ?! p, C1 V1 N A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
7 X3 b: D8 n) y3 ]& @7 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
& S& z! k: J+ k2 W- y1 `# l A. mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
5 \% A, k" }9 E3 y9 Z1 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:, B! `5 Z1 J" @9 U5 m' V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
7 e1 U6 K. j; B- j; Y4 F* m- lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
6 [6 [4 a5 A- C7 Z4 ]" u' n( ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:/ q8 i4 M* j( ~5 O. a/ }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:4 O" {% O% z) m! }/ A, N+ v, @! T& l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:8 v) A; F' h% R! @6 z2 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
6 b, \) @9 G$ `0 _5 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ G) s" c* s! I2 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:' s% I2 l4 `) j& P
Finished searching libraries' H( y0 _ d" X: n
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found. s/ m0 r2 ]1 I# v }
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm". }% }: d j. W6 b5 p' c
PerfMonDemo - 2 error(s), 0 warning(s)
6 A! b2 E: a- U' @: ~* o7 ^========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
- ]1 t/ W6 c( ^% P) x" h q
' F: j P F" ?/ ?; R7 A5 x我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
+ G* T; R. M$ E) V解决方法如下:- z) |% |& S* [8 P
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
+ Z( e; |$ T) I" V4 r; s加入* n6 g8 b8 c0 [: w e
nafxcw.lib
+ q V* R2 c0 ~libcpmt.lib
8 H* Q0 w) S" _! iProject->Property->configuration Properties->Linker->Input->Ignore Specific Library9 G4 V; M9 D, i* ~
加入; x L# C( _ ~! H8 x/ d
nafxcw.lib
' Z, Y* e( f( C$ j* nlibcpmt.lib
" J" j# n6 X4 m- c. ~; O% T+ f) [ Q/ l* o" E* t
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:, ?# c; O- ~/ ]4 k3 x! a
2 i0 ]3 x1 n% u; G6 s4 l2 g/ }, e5 }单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
. F9 c% S5 d3 C6 {, I5 Z. ^% D4 n多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib , h% L3 J: r& u
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" h7 w; w4 H) L' P/ `调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib + r. u( Q! q2 @# B( W, z. l$ G
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
7 u$ u0 n! {. C4 N& B* |$ I7 O$ T7 f使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|