|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
# ]% K) [, M5 A$ C$ J4 M 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
4 j* B/ K/ D7 D# A! ^0 i0 R Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:- H! @% M3 V6 i3 H; h! T
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library7 x6 G1 s1 k' [
9 } Q! x' W, P* q. K" c1 [修改成Multi-threaded (/MT)4 Q7 }1 q* I! x, r1 Y6 S
1 S" s3 p( {$ K- n- p修改了Runtime类型以后
) |0 Z& e# U$ e+ u# L0 W9 Q, k( P
需要将MFC的编译类型也改成静态库:
& t h( y/ x' m3 t& C9 J" u5 eProject-> roperty->configuration Properties->General->Use of MFC
$ m U( H$ I2 s& z$ d/ o& M修改成Use MFC in a Static Library
( `: b$ g+ E$ v1 B) r% @: h1 }8 s1 S/ ?& f4 w
一部分情况下在这步就能解决问题( o" d2 C) E* k1 b- ]* u: q
另外一部分情况会遇见如下情况3 q5 L6 c+ k$ Y- }1 P
# T% r0 J( |0 V6 Z. ~, g5 e编译器报错:, }1 h9 o1 w8 d% c. v; |5 N
D3 d F7 n* S+ J& X# wCODE:7 x* O# o& k9 h% g
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
& C; o( i: I7 z
& S' Y0 {4 Z0 {9 M" c产生这个问题的原因是库依赖关系:1 c" @0 m& ?& t2 t5 V0 F
在Project-> roperty->configuration Properties->Linker->Command Line) |% r+ u* G& _( H
加入编译开关/verbose:lib可以显示详细的库链接顺序- R( L0 {$ ]. Y0 l6 ~
* v W% L, [4 b" S3 o& c+ B& ^, s
CODE:+ q% C4 g% t: b" @
. c. ?, F# H5 p1 p& f( o3 Y
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------9 l6 f; B O3 Y2 f
Linking...
0 ]7 A- m- j; g7 a$ |Searching libraries( K; I+ {# T: y. @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
& l& _; X+ Y& \8 A( D( X& RSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( a! R+ I. t* Q5 j( [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 i9 M2 d8 d+ n5 U' Z" \# X& SSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:' c5 E. g2 Y+ t3 `. O) F
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj): C3 l# j6 F1 O9 g3 |( K% |# {! ]# t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:1 W; ^, C* u& j1 S% p- @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
& Y& y$ a% d" a# {2 F1 h uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:' k/ _7 I5 N* ~) {& D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:: t& t, r3 |6 Z7 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:6 o. j$ Q# H% a. ^: D8 C s, f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: P# L% M! x) T* V# _4 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:# ?1 F! U$ G# R5 ~8 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:1 ]$ N; r. Z/ R0 ]0 \7 B! e" l+ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:, u- W) o' U8 j7 ?- V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
8 f% o) o, E) g1 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
+ T0 o9 {7 d% ?1 f# g( {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
2 ]% N" O3 m$ x7 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:1 m! V0 |) R% B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:' ?: h {% G8 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:+ ?1 u; L6 |% w- w( J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:3 c9 t' s5 h( J/ L0 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:. \& M( v; E2 t9 i% F3 c9 ?4 y; h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:7 f6 J' c3 R4 j' p$ b! @4 }# C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
6 p/ o8 H' I$ W; `& p" e7 QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
7 |( _, e$ w' O9 t! G5 v3 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
2 f- P; g6 l; J6 N- qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:. B9 \& g; j& N7 W% b( f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
' x- y: x/ r) I$ dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( q4 r8 W" @) q3 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:& ]6 D) Z6 d" @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
' \' J3 y% R" Z2 N7 ?$ c2 H$ ~( hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
9 Z% p# R! y& s; k$ KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:" D$ J: [) z8 f! Q* ?+ k$ q- ~! o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:9 @: P2 R. R: A0 S& K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:: g0 q8 ^; x" r8 o( t6 \5 X: q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
7 U' p1 r: m w% @$ D2 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:* u+ `1 I' r3 {3 z4 K; o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
5 w8 q6 `2 H7 w! V w# ^! Q9 P( PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:+ Z; C/ P% l& y j. F2 l/ @+ t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
9 b8 N1 K% k) q# O1 ?4 L( [4 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
6 ~2 B3 o {+ @& K8 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:5 \, D. |; n, |& N+ R, a. A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
. x( G# V" m6 e h( m+ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:) d1 f3 t5 I0 ?+ m& F& Z# m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:$ B4 V* _$ n0 S# t3 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:0 b. N- V6 `$ V& c1 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
( _, F0 R4 S/ `, f8 c. N, @/ A! MSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
: C) q' z; l! }( w! hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:: ?6 j. {' z9 e- C( a/ Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
" R* R& i! @/ x; p9 _& V& j8 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
" d3 D9 q% y- z: ]! \; V0 t* v3 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:, o& K% L1 L* G" ]9 i2 B- L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:" ?9 E/ J3 T" S6 ~9 U" u9 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 D6 M1 Y4 x% i& X: A+ z
Finished searching libraries3 r% L! a% |9 x4 ]
Searching libraries; r( ?1 o% A, V1 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
9 X0 i3 D! I: r" CSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
% u: z" c; n, C4 s2 E6 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:$ t# U- M7 |5 a0 V& Z9 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
2 Y7 s1 t. Z3 f$ z% E, j1 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
- \6 _7 C! A( r) A% MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
+ d5 x0 ?) M3 N2 |, ^7 ^% ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
) c' W; \9 E# O0 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
0 v7 F1 S M# V* [/ iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:% x4 a4 p U4 `; y& B: O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
0 x5 b* A' U. s/ Q0 c' _* RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
# X+ D1 a0 `" ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:) V( L% d, Q) G, f3 ^" n9 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
- m }8 S* y+ ~& h) oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
- Z- T& A) E0 |; s& k5 ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:3 v, `( P5 T$ t4 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:( V/ r# _0 \# M8 {1 g3 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:8 B/ T& K( V( T `, P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:) x: X9 F; R9 X8 W& U4 w( J8 B9 x, u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:' C R# ~8 V6 T) \! y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
* B y' C4 {, N2 ^ m) }Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib: c" z" g, q0 q: j1 y m: m0 K" T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:/ X- Z# ^2 ?- `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
2 ?: w( ~% [. s; nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:7 _; t6 V( ^; X) w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
/ d" h& i& _ s, T, D6 |) OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
0 M" `" x1 U3 r4 C1 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; A# J1 N7 m7 \3 p* s, ]! pSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
1 G1 I% M' l- X) h# U3 I$ e" SSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
& X0 C9 t3 Y$ `0 ?: @2 f- TFinished searching libraries% z' g' e- {$ m2 f- T% w* L
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
) |; P9 z( t7 u* [Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
, F* p% |) X4 i! I9 d k! y# |PerfMonDemo - 2 error(s), 0 warning(s)
: ~2 }. R G& Q; o# k/ u* P========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
' P( p( K3 c7 x! o8 z5 N* D- I" ?! O" r- H3 t. B. h4 n/ o
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。3 {. F1 o! v |0 T9 t+ {" @$ Q
解决方法如下:2 a+ ?! T! O5 z+ ], J4 G2 y9 z
Project->Property->configuration Properties->Linker->Input->Additional Dependencies [. h2 U Z, _: @: |+ D
加入8 @4 v6 v8 p b d
nafxcw.lib
% f7 M) J0 s6 N F# ?libcpmt.lib
) c: ]) b7 s) V' LProject->Property->configuration Properties->Linker->Input->Ignore Specific Library6 _: V6 B: _8 d5 v: @6 }
加入
8 a% D0 K, J* L; Dnafxcw.lib
1 b0 e* [* D8 h* v6 B! t4 |: mlibcpmt.lib
3 p7 v+ O" H4 o& M- l
x& l& \; h7 l& n f# T' l 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
9 G+ _2 H: F2 B+ z. V% x
, O _. {3 t2 ?1 I' j单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
# E. }+ Y% e" P/ I多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib * o1 \; J8 d! A4 R
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
0 `5 r6 X- P& }( k: Z( E1 n调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib & \" F/ j% V" N$ k3 x1 b$ K
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
: ] S( o6 Q. m6 F6 [5 q8 _使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|