|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
1 h& s: o( v, j# U8 d 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。" [( N! {7 d$ L. Q) V1 w
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:) A% ^- u' C: q' D" e5 S5 n
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library9 }, [5 F6 N" b7 F3 O( Z
* Y, u' ~8 ]% f7 ^/ P& v6 q% X
修改成Multi-threaded (/MT)
: J# |5 m1 K5 z& W4 ]- V" c, O- N. X( w7 ]" Q2 ?
修改了Runtime类型以后8 G6 o& ^& c- y. ?
) T) ?4 T0 ?% a
需要将MFC的编译类型也改成静态库:
1 y1 U7 w5 z- S+ @Project-> roperty->configuration Properties->General->Use of MFC6 k6 A& p; i, w/ O( M
修改成Use MFC in a Static Library' [: S0 C' a7 T: l
0 h) \5 [& B. w一部分情况下在这步就能解决问题
1 w1 L0 Y) B: ?2 N1 y8 F3 ?另外一部分情况会遇见如下情况
/ F4 s9 L, v& c
% Q1 Y4 f! d5 g编译器报错:
% h; o; f4 V1 B
, t9 ]1 q9 i. M; WCODE:# b# j- M7 T: {8 [8 O
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)! @* b; g; }& Z
% B' T) y0 E8 V产生这个问题的原因是库依赖关系:
p& Y1 {& g& y9 f3 s" s x在Project-> roperty->configuration Properties->Linker->Command Line* Y7 X8 Q6 y' x
加入编译开关/verbose:lib可以显示详细的库链接顺序" L( S5 ]# ~) j5 \4 U
( L! h( I+ p6 M
CODE:! f3 J5 B8 H/ R6 y
8 j5 J9 c |" U
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------% T+ K# L/ W0 X- G# z9 v
Linking...
) a8 L! ^, N+ Z% J6 r' E F kSearching libraries
# g7 N1 ~# _1 W# FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; J3 ~1 i& k! C$ l s3 K9 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( ^5 ?& o+ N* {; ?+ l3 Z, k! l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:/ m8 ~8 Z% n! ]( ?5 W9 b6 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- r( R$ ^- u m* S, K
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)! h! |0 `4 X4 a* I1 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
9 [; I5 M- y/ Q; ^* m' y( CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:9 q6 f3 w5 {" f& d8 U; ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:) q {8 J0 r5 q( j1 o2 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 n D- s: ?7 t# X+ ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:/ G0 K& h" m( a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:0 p/ h) u; O: S6 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
9 O5 S2 y E" D0 o( P% E2 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
4 P5 z6 Z; j0 |4 X" ^8 S3 n' sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: b+ B: J+ m" _' x T* @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:9 R( g$ a8 w; E3 @& F9 L# ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:' F( t" W: f0 J: M; u+ z1 P {2 a, v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
7 R+ F+ ]- F4 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:7 e; O$ P4 s1 F5 o7 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:! a& P, D, Q4 E0 Z8 x3 c! b% a& z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
8 \. c5 n' J$ t qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
, v0 G# `8 m: B) iSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
0 X$ `0 ]0 `9 i! M; X9 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
1 M! V0 n9 X! U& s3 |* JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:) G+ _% ]* m5 `6 \. e( Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
: q& M1 B9 m$ kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
( T; A" O( k6 ^, ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
$ z0 \1 A$ N7 v& `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:8 g* d& X/ ~# @# D; }" }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
6 {. C$ o4 U2 Y. h4 ?' F8 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:0 j; S2 c) [) Y+ ]! E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
5 i" S# i; t5 q p5 F! c+ J4 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:! Q. Q8 C2 F. {- j$ _2 |) l4 K0 d$ G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
$ t+ E! N- H8 Q) o! OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:* z/ L# ~) z( x& Y/ h' |+ D, Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 Z1 b7 B4 E$ i; @" MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
1 R+ Y2 }; _7 d8 t, ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:* F$ ]1 j+ A- h8 Z. Y/ H; G. Q" _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ g5 J ?" Z' I" n9 K; J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
0 `* A4 l/ a* z' k4 g. J, OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
1 I$ o7 o( W7 _# D h0 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
; p# d4 E0 k' [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:! K/ S# |' R; ?5 S, I k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
* M! A1 o o+ P2 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
8 J: \) l U! k! H- T' m" D) BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 W2 N' F' R9 x- d9 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
* j4 p" i, l8 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
( A# F( P# h' iSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:9 o+ x# N* z0 O/ D6 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
( l7 r5 p3 y6 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib: Q8 \+ f( f; b+ f& [6 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:: Z2 t$ v% r* K# E1 |% }4 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
& c8 ] o% Y c# L" [/ y# m5 `1 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
7 H0 B. g' p2 H- |Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
+ e% O2 L3 q1 i9 z, L7 |4 X% lFinished searching libraries5 k3 x" U, l4 ~; l u4 E
Searching libraries
$ S" W& h Q2 ]) x# G5 D2 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
5 z; p6 \6 B# V& J) {- s9 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:8 T/ T- ]" O8 F$ h" R5 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:) } p% q0 @9 I$ L* _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, ^, s! N: B/ F7 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
0 p7 c* w* T( A6 T( f& sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:+ f( ~1 ^; K3 F. g# A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:1 `* `' K& U. a n* a8 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
" T+ U( P7 p5 I+ j; @' @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib: g, U0 t, Z9 W# k3 n# g2 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
- f! s5 b; x4 i3 Y- C. ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
. ^' G7 R9 i4 s( H5 y' iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
2 B( C9 ]4 U9 F& bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
* c% d! ~4 M+ |# k" tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
* B$ m# U: A7 S5 xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
- T/ t8 S: J' `8 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
) k. t- ^% l# U& ^# F w" O" G" |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
1 I3 y0 L- r0 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
# s2 h3 G( d$ c1 l& F# @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
4 d0 Y1 U6 y( @2 d9 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
. O- u/ ~! U- w$ R" t9 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
6 n8 Y! I* L- e4 Z, d3 F9 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
, a, x/ B- V2 P* h& w& s% lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 F. P8 f- I3 p3 A" Y8 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
; W; l- M, E/ [ A" w, \% u+ K1 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
8 f, t7 D7 P: g# W0 ~' TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
1 ?; @0 n1 @" s# ~; sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:; {6 R8 ^$ b) M, g" _9 Z# P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 q7 i4 D* c6 C* R& x( e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:2 U$ T2 ]* K- p& A- \3 c8 H
Finished searching libraries
) y, _ i- t# @.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found; K/ S3 s- J5 d! Z3 |
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"7 x: r) \7 j0 M6 R# e( B( Y
PerfMonDemo - 2 error(s), 0 warning(s)
2 q1 t) S* R7 W========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
) a8 J1 p% E4 b+ _% C" \. W0 Z; R( ~, o
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。" i1 B9 O3 P: ^0 |7 J. T8 b
解决方法如下:' O; _* _, d8 E% [6 a
Project->Property->configuration Properties->Linker->Input->Additional Dependencies/ F& @% N+ ?8 R/ U7 P
加入
* _% D8 ^: }4 l3 Wnafxcw.lib
0 p, `4 f; }' |3 {6 {libcpmt.lib
0 R6 Q; y/ X& P. I3 [4 wProject->Property->configuration Properties->Linker->Input->Ignore Specific Library2 v P9 H" l$ ]% e0 m7 Z' N
加入' B+ |1 ^7 }$ A+ c2 ?
nafxcw.lib
; S3 ]8 x" a1 ]1 t" B5 S+ {7 Rlibcpmt.lib0 z" T) j9 c) c; o* q' h) s' U
$ j6 t8 L8 |6 a
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:& y2 j& B& W1 v8 I0 e
& v- j3 t& Q0 Y O# i
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 5 v$ N- _- r/ ^: M/ J
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib / v- P4 [7 y8 i* G3 g5 K4 \
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 2 R' Q% f, i$ i
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib $ D3 b3 u* i9 ]1 {* l, {' f2 n
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
; i2 G, L; m& G" m# `使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|