|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:2 U( n- g% o; J3 B0 U, [- y
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。 K1 ~; Y: x. W
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
8 \" x ^; G; [9 N l; QProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library0 x S! ]6 c# G3 J" h; u( Q
# y' s' c3 m. F' F1 y/ O
修改成Multi-threaded (/MT)
" |; p- \1 Z6 @' {! o, L0 b" B& \( a
1 }1 H# H# `& V* I1 w修改了Runtime类型以后* v$ p! n+ H# W: |
1 G% u2 {% w& U$ L \1 ^- ~% e
需要将MFC的编译类型也改成静态库:
* t& l0 t/ g, N! aProject-> roperty->configuration Properties->General->Use of MFC
3 t. Z6 R( n" t4 c+ X修改成Use MFC in a Static Library
1 P9 a& G1 @0 g; o* m: o+ p5 R1 F Z( t! V" t! G8 l0 {
一部分情况下在这步就能解决问题
6 [; s6 L9 }2 p: k另外一部分情况会遇见如下情况
! u( E* P, d3 ~- h& q( U# `1 X9 {# g& i$ d, X5 y
编译器报错:% z# u# i' j) J. j. S
3 U/ v( e) f; f7 K ^* tCODE:
' ]0 C" ~6 l* x8 p; d1 k$ V8 Onafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)0 g1 \$ A7 j2 P2 Z! R% y7 F
( b+ V% e6 g" o# R- k8 ^
产生这个问题的原因是库依赖关系:
3 A! f2 R7 X. n6 s$ c在Project-> roperty->configuration Properties->Linker->Command Line$ a9 ]% `! Q9 d/ C6 ?& A
加入编译开关/verbose:lib可以显示详细的库链接顺序1 \+ M) f: H# a
: S/ i$ l& _- j8 B
CODE:7 D* J; N* ]5 `
& Y& a4 V7 K P0 a$ ~1 P* g5 U6 n9 s
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------) m2 |0 K, g% j5 @) R; K- I1 P
Linking...$ C8 k: c4 O, c; D4 B
Searching libraries1 \) r4 s9 F2 L+ }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
w5 l; s; U* TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
5 |2 i) l# F7 l1 v9 X3 X4 O, dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( H9 F. N4 k- }! aSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib: V; v$ W& Q2 T) u
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
. I2 A' f1 p8 C. \0 J+ u# J8 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:3 d" [5 m1 F3 ]/ i- n! C" e, @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:- g H8 w6 P; O3 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
* y0 V% K# n" l# ~5 v! B& xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:+ J3 o# y! y; j# f8 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
O! y n5 h M1 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
8 {9 M; q% E6 D2 Q: rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib: w2 f0 I+ F$ b: G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ N' C' P n; u& x6 Q6 `( T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
' q9 P t) u) I! K! Z/ O# ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:) F* Z# `, Z5 p( d, G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" r( P/ u% [6 Q" z2 ]+ ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:( o9 @# x( s' V- W: x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:, _- z% B1 b4 B4 T [9 Q$ b P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
( `+ Q' E- R6 g& o. y2 |$ LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
* j+ U9 W; [- A5 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
4 U, e- ?" T2 l; _) G1 F; t4 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:! U! i! ?3 l Q0 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
% }1 g8 j0 a7 `! w9 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:8 C* A/ \7 O% x& c% z& I& P: X: X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
3 _3 T4 L3 z$ p1 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:9 U4 @2 D4 ~4 e6 A2 D! R( [. U6 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
8 R; {! E0 i+ Q lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:- S' q0 P5 @' m. B! S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! ?8 h# i. U( i6 \& s, NSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:# Z. t+ P" G8 L6 H+ x$ _3 E7 h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
8 t8 f Z; D! v1 ` ^: uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:: G. T# z- ^5 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:' ?. h% H! S, G& `' @4 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
: w! m6 P( }, {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:* e, p8 Z6 G. e7 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
( S9 n$ T: l9 h$ V) M1 G& WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
) U3 o! V0 D! M; x$ ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:% |2 h6 j4 k. X' m0 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
) a) M4 V& B' KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:. L2 I3 ?2 v) V0 J# p1 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:! R" }% h" X% a X0 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:6 a) p. d4 H" K- c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:% k0 _( @7 }2 @# D5 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:8 J: A' R' {% n9 v4 \' ^; `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:% O" F7 y& @2 M7 \! g8 {" F' s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
) |; f, ]/ C( `, [( N& gSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
+ V) T7 J# b9 a7 Z! lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:- O2 b6 }7 w2 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
: ~ O& ]1 @" \' z' E" L# GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:$ H2 @4 ~( @% _. s6 e& h1 h% e6 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
: r. G1 b& [6 T3 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:% l3 J$ n6 T% j6 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( g) _ `' l0 h: u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( P& q1 s7 A9 O+ P) P# f0 MFinished searching libraries4 M' n! |. p d7 c3 _/ Y" b8 c: O. G& H
Searching libraries
1 V9 u: ~7 P5 Z% F, |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:( J' F4 g. ?, A5 F, R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:0 {* Z, o/ u/ q# t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:8 ~: x5 {/ C8 T9 }8 y2 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:$ c; ?6 n M& R/ n( Z+ G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:8 I4 Z( x5 T) X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
8 [" a1 P m& x$ p" RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
$ ^/ h' ~- Z9 [- K jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
# P w' t: I* uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
) s4 j0 F1 s* F( gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:" x: C: H' q; \- k/ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
0 e6 ?; v7 n, @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
5 N1 S- k2 _4 Z, F I# {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
/ Y- k3 ~- p# i/ P) H' LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:/ b# v0 ~- |+ U- N; Y% [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" R# R. S% K9 t& C9 A" C9 U' zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- {* b* n+ R$ `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
( x' x6 B$ [+ n: `% \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
# `" M6 ]' u5 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:8 q- d& P8 J; T1 j5 a4 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:3 q7 \+ H; `3 j) U3 d8 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
4 C+ A7 }- p+ k2 w6 e5 {8 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
# X9 }4 u5 q% ]* s( v% @: R5 P# ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:# j. n; V& e' B4 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:, L* H* |1 P7 G, M& M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
1 I/ k. V1 _$ g z. P$ h/ ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
, P/ x( w9 ~, Q" nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, f) ?4 }$ d, {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: R4 u! N7 M+ ~2 [ a2 i, ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
" [2 }0 @5 I4 y/ @3 {+ _Finished searching libraries
/ \& I: ~5 `7 _.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found7 P. d0 {% G4 F- g
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm": q% ^5 U* i( {
PerfMonDemo - 2 error(s), 0 warning(s)# D U% ]' s+ T- t% ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========, V. |) Y9 Z: E6 q7 d1 o
/ L" W) m0 l. N! T我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。; @5 Q5 n* ] `$ Z$ X2 T- {' `
解决方法如下:6 C& C6 ?7 g1 A0 c7 t% X) @! G( A
Project->Property->configuration Properties->Linker->Input->Additional Dependencies' v. X3 P) y, h0 n
加入
; s1 o4 W3 c4 O& Cnafxcw.lib6 |/ Q) S+ B5 K# E+ m3 ]/ q
libcpmt.lib/ Y" ?1 `$ }' r% |3 `4 w. ?% ?
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library+ ]% f9 C& O! k: `
加入8 P( D6 w" V5 P! y4 v6 F
nafxcw.lib+ c0 c- m0 O- Y, \0 l& w
libcpmt.lib
: z, t# @$ p5 h8 o' j0 _7 o" X8 {, B1 r
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
4 {- k/ c- q3 L0 ~4 g, Q! A `7 T0 C2 |" D2 J
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " E* S5 b- L( V# n) Q) X
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
1 m' `( d! ?" a使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
! _2 ?4 O2 y2 y4 S! g3 F, r调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
1 z" e1 K3 a" V1 M/ c调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
% [7 O. f1 {; F9 R使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|