|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
1 R9 ~1 h; ~* ]' O3 a3 n9 n 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。4 @6 @) V" B1 c) I+ N
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:) p/ B) {4 Y9 C& h( c" [5 \
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
/ Y: c) R0 V2 t7 Y2 e+ B
3 I' M# N( k5 H1 c# i9 s修改成Multi-threaded (/MT)6 j$ v4 Z( E) ]' C
3 n# x, T/ o$ G* P修改了Runtime类型以后7 `2 A6 d: S3 u
0 `, i* P# L, B+ Y- x; X& \需要将MFC的编译类型也改成静态库:
9 |8 z8 i5 w3 CProject-> roperty->configuration Properties->General->Use of MFC
6 c( L d6 x# `3 }, F& Z修改成Use MFC in a Static Library p8 h* N! d' m9 R8 @% Z% ~
3 H( r1 ?/ f. f4 A! }- t0 d一部分情况下在这步就能解决问题8 c0 j, i7 F4 ^0 i u8 n
另外一部分情况会遇见如下情况
( ^ X! p8 c9 u0 I( K; J
: k& E1 V' u" [$ Y# q& ?编译器报错:6 J- L# ^( I- A0 L8 i8 d/ f1 `
, e8 p, a3 s' C* t( u# Q$ mCODE:
5 F6 p: f+ L. V# h7 t% h" znafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)! j9 r' W' V% M5 Y
; J0 T3 a8 [: ]. R9 W( i J2 q
产生这个问题的原因是库依赖关系:
* j7 g! u) P4 j: [9 ~在Project-> roperty->configuration Properties->Linker->Command Line
7 E g" r' {* h6 D' n3 `& w8 {8 I加入编译开关/verbose:lib可以显示详细的库链接顺序
. W, z/ Z/ }! S9 Q
% N8 n0 X9 X. t0 uCODE:
z" N; l7 O O! v B( ~
8 @$ {3 i, M+ Z$ [------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
: {% y# V' e+ ~Linking...
+ v8 ]9 Z1 P+ _. P1 ~0 N- VSearching libraries
# h) f- I: @3 Z K6 `- BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
3 K* n2 _+ w# hSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
9 D0 }' o0 P/ q" c! A' w5 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:: u) U6 L1 C; [) f, E2 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:7 n- ]. j# F! W0 s2 k/ c$ L& ]' E
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
2 }9 D% i* a+ ^! E9 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:2 n/ L/ f b* ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:4 M. s& Y3 E9 \. Z! W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:, }* i5 _; u5 W+ \' P" ^: |9 K1 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& U( Z A/ E+ y q& D! ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:: I0 E s# H' ^# u8 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
/ @, `0 Y! F. V0 x2 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
. w7 d! t/ G" O# h. QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
- m0 Q! E- F8 @* y" y7 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
3 b9 s7 b: d* ?& V, V3 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:1 s: c$ v9 u4 q! b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" E" j0 c: a2 _+ _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:$ L+ e8 `3 A" R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:+ T' O+ }: }- T8 M4 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:$ q8 a6 Y9 T/ l) b. @5 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:+ u5 A. M, S- a! [8 u) ~: e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
! R, {: d( Q0 X3 o) lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:1 D% o# ^# p# b. o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:* [- ~1 x6 F5 m) s& a+ |. P& v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
& G v+ ?+ C: V' }) o. \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
5 E% t4 f _( F* A1 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
0 Q: F g1 v8 S* aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:# ^9 ^$ S4 n9 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, Z# r' I( [. ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:! U* M! n/ Q2 ]: }+ d( k+ y! v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
4 E0 x) Y$ n+ b. F- ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib: i: l' }. o& y; V! [) R0 h$ D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
8 u8 ?1 G% i2 i6 C; d; y' FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
1 C k" ^! K* c# t' A% I5 L! ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:6 f z5 k$ F9 h+ j0 T1 J+ D; M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
( _0 S4 a! C& h9 p VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:5 B% r7 h9 \/ l2 c6 B# t, p4 B' z. y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:& [- c" h5 H5 i" \- R7 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:: j [ L( M7 G* U* t. l" ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
2 Q: T2 l5 a' U, ^1 Y5 L0 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
0 z/ K" G$ p; A f, H' PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:# T& _# D) K! ]4 X7 f6 |- S7 l/ h2 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
' \9 T. g4 G% L+ H: pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:! `8 b; v Q7 v5 p. Y. ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:! ^2 M" X$ J4 U. ]) t7 w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
9 o: v8 Y% B9 I3 U3 T: ~6 D4 |) C' PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
% p# c0 t' P* E2 E# y9 USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:# T/ p L7 o! S( ?- F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
: A4 U7 d6 D' T: kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:, u5 N7 J/ z* |0 o9 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
4 X7 D$ n) Z6 p6 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
* y+ k- L4 e4 x3 {) P sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
9 k) U6 n" I# q' p" o4 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% k- f a- `9 g" [3 d$ X+ h7 Y/ W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
" B4 O z2 ]" D3 B2 y! [Finished searching libraries; S3 d# P1 ?( T) c7 U) ]2 @
Searching libraries
# Y$ U0 C4 X3 l" E2 \7 \* ^6 xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- e0 B \$ g: E0 l# SSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:, y9 Y0 z: ^( N0 Y4 R. M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
5 ~8 Z$ O }$ mSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
* f) ]* B# c+ R4 u9 t: ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:. ]0 p+ h$ c! k9 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:( D# u8 p) E' m- y* ^3 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:# J4 _& Y8 {9 K) J! G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:! V6 H5 M/ c7 Q8 r3 T+ P2 o# g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
6 S6 R9 }$ {0 P% X* Q* F7 _/ J2 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
& N) B' n& t( A" B# ?! gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
6 h; T R, o5 N' `1 W) eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
9 x1 y& z5 z* ~& V3 F9 l1 U0 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:, F9 o3 G/ u2 u% g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
1 O2 G5 X8 y4 _8 h# M$ z. }% }6 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
- I; D$ P# j6 t4 z4 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
; R" R- n- i# L% q0 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:- `3 S+ J$ N/ `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
2 s. w3 R" [+ b! V4 S) l7 ^+ _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
8 ?4 L3 z( [* s- I2 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:- I: z2 C' g0 ?7 o4 f7 P8 @: G4 F! R9 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
: z4 m& f. e/ o+ _8 q: ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:( o, I: }/ G6 e- j% T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
8 o6 m- h3 M$ A3 v, LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:6 X) n4 s ]7 X! k+ z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
5 W J: M- E- ?, ^! ?' E9 f3 E1 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
' D, t6 c" N% T" O/ \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:& O3 |8 g0 I3 m. ^+ e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
8 [% b7 S- X q9 n' qSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
: M" Y" x' Y7 \" n3 _Finished searching libraries" M* D+ p- n7 `' f
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
) E0 g2 z7 L; k. a8 XBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"5 d. Q, g- x J T8 J6 J+ ~
PerfMonDemo - 2 error(s), 0 warning(s)
. |* k* J7 C1 ~- B/ k========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
8 {# P" S- ?+ _
( h7 P6 z2 ]0 f0 e我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。2 B+ T) _; Y; @3 ^) c
解决方法如下:, V! R8 T) ]& I7 O6 I0 d) f
Project->Property->configuration Properties->Linker->Input->Additional Dependencies) F7 L0 @2 Y& l9 \' ~
加入0 ?& s# I% G: L8 S0 i5 g+ [: v1 a$ B& A2 t
nafxcw.lib
* w& K, n/ S" F1 U. @libcpmt.lib
9 x" _2 j6 d" SProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
5 m& @7 r% }+ P. U$ F9 u2 A6 H( e加入( l# r' z- d; A
nafxcw.lib0 Z, T0 b: c% N
libcpmt.lib S: c: E9 r6 M8 g- f8 t; I
; {2 o7 z" `! U% c) e& W 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
( X7 y' Q' {. }2 z* \
3 u% w3 C4 k* M2 `; u2 ?6 g单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 D/ n& j+ v) \9 ]; O3 P' C! P) A
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib * q% g7 Y# I$ \( \
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib : f' g. `( u N
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
) X5 l& L5 |% O) E# p5 \1 K调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
. ^( m/ ]7 V3 i使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|