|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
: @! X9 W7 g1 f+ ?/ ~1 q 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。6 x3 E8 ~- \7 [ t6 S
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:1 T* ~/ |% W" f: V: [ n& ]' \
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
5 m* Z! q1 t# p$ ^5 _5 h: }8 @% K; d' C" G
修改成Multi-threaded (/MT)) J0 b: j6 W7 h( V0 V a5 o
( v Z1 K/ f( S; v& R修改了Runtime类型以后# Q) ` y' b" B9 T K
5 }2 J1 e: z" Q$ N6 Q0 o需要将MFC的编译类型也改成静态库:
: ~, }) g0 B4 }Project-> roperty->configuration Properties->General->Use of MFC4 R5 s+ W9 ?' ]# T
修改成Use MFC in a Static Library
2 q E) \; G) x. Q' h" h& Q* Y8 Y. L: e6 ^5 a! ]
一部分情况下在这步就能解决问题* [ y/ X- b/ Q2 j5 W% T$ m
另外一部分情况会遇见如下情况
2 g S i ]6 r& J% E n, s* d5 P- _ X1 L) i! u9 C' c- g
编译器报错:& b9 E; v# [, C* M
% X) r& d- O+ Y6 z6 o/ F; i. A
CODE:
, K) o, L3 Y0 c( U- inafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)4 Z7 {, R& e" p6 O7 L; Y
4 r8 n8 \ X9 L) G9 h4 l
产生这个问题的原因是库依赖关系:. d# ]8 P j9 D: N& `' \
在Project-> roperty->configuration Properties->Linker->Command Line2 B" x( W" Q5 i3 |: R% p
加入编译开关/verbose:lib可以显示详细的库链接顺序
3 V _/ h( S. X8 s I5 i0 k$ w: H( z* i4 `6 z7 z/ T
CODE:4 q1 O* m( H, P+ S' p; g1 r3 H
( _. { X1 a6 n3 {/ \------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------9 j" X* \1 J8 F9 u, s/ `
Linking...2 G2 x. h( a' X* x$ e3 j, s6 s
Searching libraries3 U3 A \! b( `3 ?; @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:1 O& R3 [+ }+ M0 z: \1 w) D1 Y! T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
1 ~0 L) |& r- tSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
& \3 t$ e" ^9 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
{# F0 J* {% {+ ?, dnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
1 W' ?! I* O+ p3 e/ sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:' U- ?: j# x& S' f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:. B" W( d4 W/ M$ F0 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
4 Y* k S! o3 o" z' L3 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
( U9 p' ?& H$ G; JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
' W- E# u) t; @' \( Q& B6 v; pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:/ v* W# A1 Z6 z0 d" |9 K' E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:( W% a3 L# ]4 Z+ a: K( r+ }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! t) C7 I+ t" Z# }4 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:( O- ]! o. I4 i8 Q/ l7 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
: D! c9 k. \& f; h7 v; lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
' F( ?& ^$ o* A. }3 QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
0 p: m# m; H9 v$ a" w. gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
. U# V/ a) y9 `6 C2 g7 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:/ P# F5 ^; F9 E! i: x( H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
3 v5 T1 N$ s& V) O' USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
) Z+ T- l0 c/ e/ J- O1 s, i9 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
/ `" |) F& M5 J" w) |( DSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
$ B& \ b8 A. |: G! R) @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
) R# ?0 q9 ^% F9 ~ cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:& v: H1 I, @, J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
( o5 \" o' b- X* T' _6 T) W, gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
+ M9 r8 s8 w2 g4 ?+ Z2 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
4 F8 J4 P% c: \; aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:: ]- d* e1 W5 S4 j/ j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:% i; w# H1 n6 b6 \; { j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:% j0 f4 J. J2 x# f2 d. J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 }+ F1 a& K9 c0 Q" b) o' nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:& `) Q7 r! m# q. S' T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
) r- R$ o# z# o0 C! m6 l8 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
, [' D, s* T) H/ E8 [ k' m4 e/ sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
' B9 L7 W/ _2 ?3 D9 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 h% _% X' G. m: Z9 ^2 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:$ G0 ?, J! Q/ x) }. c4 D& ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
" [( w5 m$ ^. I3 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:$ [. v, @0 L( \4 n" @; [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
0 W) ?* Q9 a4 `( M5 b N( i/ cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:$ f9 ?% |1 T5 k1 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
" _/ F {7 T, XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: M+ k- v) c" |# {% p9 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:2 z& F& m( ?" K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib: N1 I6 ^" s2 d- m5 L& N/ s+ [6 T3 B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
7 {( S) G4 G0 ~* {- o1 v: S/ X, `Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:( x7 ^6 I, X2 Q) y6 a7 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:0 M9 Y: Y w& s" y- {, w$ `% J& m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: ^- } e3 W3 L' u! D; M3 l& A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
1 _) ?) b0 M$ B: |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:1 c) \' h# t u6 O1 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% ^, B# u B* ~5 x8 V0 H( ~' P" [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: C# P6 V( B& o9 i$ J( T1 VFinished searching libraries5 {2 u3 b, [3 U6 ?) m8 W- m% S
Searching libraries6 |/ i g8 ?8 e1 U6 l! v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- v# w" |% z( c/ P4 m. J( QSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
d* o' R J' i4 J& ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 `: x) a5 t) B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
; _1 q9 @5 W4 _5 W+ T q) wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
5 Z3 e) |, M. R: |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
& g5 T0 w' d) S0 }8 \, Q8 N% HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
: `3 z i; f3 o! GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:, i. L. ]2 \8 t, ? K# u) J% p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:. O5 J* j6 _5 s1 O: _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: _7 I2 N& u6 M: i1 V0 a F, v& e0 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 p/ l/ k5 a2 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:' {/ ^5 x K) J% D. B" t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:2 f" U; T9 a. _( h+ ^9 O, v' D0 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
6 N/ D# B. A- x$ [) D: FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:" n6 H$ y4 k% a4 T$ d! e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:9 }( O- o$ z# l/ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
1 f5 g- P0 k" P, ?8 `' r# m8 m0 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
2 d E& L @8 l4 R; W( ~ xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:, k- G+ b' [: |0 M l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib: k7 r" }* V F! b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
3 C" Z- \9 G6 G* ESearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
- M; @2 r! V: V% @: N0 D0 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:9 S% f+ t- y. }, E2 a/ L" Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
% e; L4 i; W% k6 T( YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:1 L i& I% i' {. ~3 k% p2 Z: z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:4 B8 T# j' ^& T! g" m) O9 B3 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: A, \- r6 O! Y& z$ h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:2 V! i1 l. M3 `/ T8 l H' Q7 z7 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:4 x8 j- K' e3 m; \& m; ^" s
Finished searching libraries
/ M3 w" ~0 B" d% x) T. e8 `# l.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
9 I* }) n) S2 f( {" H' N/ c @Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"9 I9 M. k( P) S4 v
PerfMonDemo - 2 error(s), 0 warning(s)+ Z3 Z: r- P& S4 a* F7 o
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========8 [; o/ s2 A3 \8 L
7 x1 x" A6 M. M8 H. S' k* `
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。5 w$ M6 H3 G( U3 o8 v, a+ h
解决方法如下:
t1 z: c8 X, S: f( |0 L* h; PProject->Property->configuration Properties->Linker->Input->Additional Dependencies
: k L( I0 v/ D. W5 b加入% G S( I6 d0 F
nafxcw.lib
8 W" D' C4 n! elibcpmt.lib) J3 M) i6 J$ C1 N# n
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library5 |) l" x* s- V, Z9 \8 T8 @
加入6 J2 s0 q8 D% _/ I, |0 V4 R& a
nafxcw.lib
# W" G& Q% s8 f7 O) _libcpmt.lib
6 @, {0 g+ ]% y0 I4 P' i* o- I! x" o0 p! i- ~
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
' A; Z- E4 B" m4 `5 [6 b* l5 d& V) E8 F: i$ V0 R
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 s" K1 H: z ?/ C0 w R' H
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ( K8 ^3 J+ _3 j8 A/ g7 _
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
- E& k+ r# m5 v4 T( t, I调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
+ B9 h$ s8 n- x9 T6 u( A2 x! s调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib " G+ W4 ?) w" D" d
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|