|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
) O/ `% \7 n6 S9 V; \( y 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。% s( m. e" o) A6 j4 t3 E
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:( |3 a& U& e: d$ J, C# V7 I
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
- W9 D8 \) d! C( j- t9 `; E3 W! [7 ^+ H7 C& ^
修改成Multi-threaded (/MT)0 e! g. F: M) N
1 \$ l1 T9 E; I+ y& F7 u1 H修改了Runtime类型以后
8 G. D6 S" i. P4 y) I" |3 n9 W/ S! A; ?- }2 \
需要将MFC的编译类型也改成静态库:
1 s+ h1 \3 C& l9 mProject-> roperty->configuration Properties->General->Use of MFC: v5 o2 h7 T5 `
修改成Use MFC in a Static Library' y5 P$ S( g X" S: c* l3 ^# @' I0 X
! l1 }/ u4 k1 I2 r3 d一部分情况下在这步就能解决问题. `" M/ W/ J; P- F4 i: U. P! T7 O& U
另外一部分情况会遇见如下情况
5 ]" m! i# v5 R6 Q7 Y0 s$ E) W0 V: F, e( @* q* _: A: w1 V
编译器报错:& i! n: P3 s0 z5 i
# o* v3 n _ d" uCODE:7 J3 `5 Y- _; p. V3 ?7 j$ d
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)4 @! r4 r7 }; m4 f
4 W; E5 x0 X; B' ~产生这个问题的原因是库依赖关系:5 ?) b+ N+ t3 t) z1 t
在Project-> roperty->configuration Properties->Linker->Command Line
5 Z: I9 t& c4 P加入编译开关/verbose:lib可以显示详细的库链接顺序: X3 i0 v* o+ _* V
" Q5 l2 H7 B, }: ^8 u9 G. X
CODE:0 G2 q# k* Q" o5 z- m3 h" N# }: y
% Q5 w( b u6 Z9 |1 |
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
' D( z* g3 F( K. L( W* R% U: gLinking...$ x9 r, T0 k# `: L3 E3 N X
Searching libraries3 m7 K0 N. x3 j' J3 M9 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' x! H9 H2 o, U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; u; ^( ~' W+ K0 Q9 Q' ] R h' ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:! } s! Q- f" V8 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:. P; y/ F+ P- ]: Q+ j- w
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)+ [# N, l( D( L# {; ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
2 S& I) H& m* |5 ?9 B' o/ jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
7 J; D2 N2 c' `2 e- eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
' x" ?! ]4 R; h4 h( J- DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:0 ?2 p& C7 D# x$ g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:8 ?/ \& ~, @3 h& H2 {$ x0 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
) E3 ?' m ]" [' \9 S5 r1 s G, vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
- z1 Y; s. T/ M! ^% ~# V+ b+ j/ kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! h5 c- e% r! {$ P. j6 T( K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:, Q9 D) g9 c5 ^! g K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:8 j" ^! X6 q& E3 v0 L/ }' G Z" w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
% S. O {7 i5 p& ~. n6 M* VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
$ K7 D+ h8 }5 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:: D2 E8 }2 y2 U: M A" q, M6 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:( p7 o8 ?/ M* Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
4 `' O- b% K; }2 o9 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
6 g3 r4 T) V* Z& ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
; w" m8 O/ i( _* A, V. NSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
8 L) {; d( _" SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:& W9 ^$ r9 s a+ h4 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:$ u1 u' Z2 R5 |+ p' F& J# [+ H; k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:, l3 b; V! e' c/ W- I z3 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 X [5 N. d, u$ {1 k- R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
: P* j2 H& x4 j! F% Y: ESearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
3 g1 \, _" ~. P2 N! V, T; PSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:; ?' O: S' ]- a( K$ Q1 s, k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:, [" M c) D' n$ r4 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:% ]1 q& w8 U' p3 u S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
/ ]# _1 L+ J1 M1 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& ~( x4 p- G1 _ {3 d9 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:0 u! F' ~" _* ?1 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
2 Y, O7 @8 g* A& pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:% O$ T/ E8 H* s: {! i- P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:$ z6 H! U4 ] w" H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
+ o3 n# X; s3 G3 A* u+ @& iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:5 Y- x! q' L3 D( m- y: C- o. `: t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:+ {& `# i% T. d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:' G" h6 [' J8 W$ e' f" N0 f8 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:6 B3 ^9 M$ k6 C' h2 a% W! ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:# W& s+ O) P% b Q1 t0 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
+ E7 @' F: k4 m* {) h& M2 L5 Q$ ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
2 E, N. p# p2 f1 u8 a3 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
( o l$ C) }4 _! d2 m4 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:3 q" N! @5 I0 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
" G7 G" D- v6 u; a1 K9 y( `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:. f; }( d \/ ]: }0 J- Y0 ^1 x# ^6 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:$ S" _" }& K5 y0 k2 R; E+ g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 Q& Q' {- ?' E2 t! K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
. A" Y5 B% d# h5 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
. d) V; b5 ^/ b6 U9 iFinished searching libraries
5 L( c+ k2 M* PSearching libraries
# ~' T4 @% V" c, USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
# \ A/ }4 a1 K4 F9 I, HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* i. {+ w7 w/ G7 p9 y3 ^6 W- ?6 _! D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
+ _1 X8 G+ d6 D+ @6 O; L# k% z. l2 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
5 i& @6 B3 h( A+ nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:, T& E4 {3 a8 ~ L i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:+ y: }' w' i* E' Z+ l+ }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
. ~- S* Y2 [1 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:( n. D, Y! M/ V$ h5 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
y5 [2 B# J" @- `7 v1 J" \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
2 L1 S& R3 @! s; T) {& HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:* \5 F, X; P5 d5 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:# @3 }* f) A8 l$ L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:# h4 A$ w Z. x o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:5 o* V& a" H" ?; X) \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
& e2 Y# n5 W. L9 u8 I) R8 x4 b) \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
( s6 h4 X2 W- J5 L5 B$ k3 [4 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:9 R) }$ |; c8 R+ _6 B, I9 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:. `8 u0 G! o2 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:$ k. P2 a! d% |& T( ~( Y8 H: N, `$ S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:% S4 H/ R8 u3 h$ h5 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:' {, O: |) Q# h8 b9 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:" `, L9 b$ ]$ Z+ x) L3 ]0 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:. [, r5 w& @7 w( G j: }3 B9 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:- Q: U7 `% N7 _" |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:8 F7 G4 H* s6 V& v U* v4 T0 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. o- s4 B; Z' G; W1 S, BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
+ z q) O9 e8 L1 K* xSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
7 W. r, r, n% w( I K) D2 X8 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:4 T( b" g' @: Z, T' N" d X- n
Finished searching libraries# @' Y3 A# o. u8 r) i7 r, _
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
+ J) U9 {$ F5 [8 |7 d% P, `& D( d4 B: OBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
i4 e7 o- B7 O3 BPerfMonDemo - 2 error(s), 0 warning(s)2 x$ n- `1 d5 F5 `4 I4 u2 _. h
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========$ _( b) `( H: z9 E- I+ |
6 Q, e6 u1 w) K ?0 B0 v
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。! D# r# G3 K6 o
解决方法如下:: x! ^, s$ j- T6 b# E- |
Project->Property->configuration Properties->Linker->Input->Additional Dependencies8 i4 F* u, ]; \6 i" Z; z
加入
- ~5 X1 r$ J2 m. Jnafxcw.lib
; J5 k ^: D7 Y' ?: i+ Elibcpmt.lib
& ]2 ]- l" \! _; G4 Z A- J) _+ \Project->Property->configuration Properties->Linker->Input->Ignore Specific Library8 b7 z' |- E; I& G7 m, |2 L# R
加入
0 U/ [6 `+ M+ p9 Onafxcw.lib
4 o6 f! k5 D/ e, S Y$ {% X2 mlibcpmt.lib9 d3 l0 D0 g* R- E5 a1 H
2 X3 F2 F, G) ^# r1 a 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
% [6 @* c5 k, n0 l( J/ w7 X, U1 R4 `. s4 C% m
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
6 c: Q. L5 @# U多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
$ L- G9 c) |3 e0 H0 R使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
& y x( `- e6 R) ]3 R4 q4 T调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
7 ^& g/ h m/ x; k: ~调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 7 M5 o3 H1 j% N
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|