|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:9 b- }& J0 B3 q7 m2 F
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。4 b# A9 ]/ S" z) o& L: d
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:, C8 H4 u7 U! U7 h, V: E! z" n
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
( g8 s( V. g% S9 e4 v
3 O/ ]5 d0 T% I* K8 n a9 Y# q修改成Multi-threaded (/MT)
5 Y" G' v! N! D1 S3 U
/ B6 @1 |& K; s4 q! H+ \( Z3 x修改了Runtime类型以后
! G( y) O5 a" |7 }% F# `$ N% @/ J" u
需要将MFC的编译类型也改成静态库:4 ~0 X$ g' r$ Y5 a/ a, l
Project-> roperty->configuration Properties->General->Use of MFC ~. N' S- S/ Z! p! p! G5 a
修改成Use MFC in a Static Library
! e4 O$ z+ N; w/ X1 a Y0 w, ^: w; o) y0 r7 K0 z6 W
一部分情况下在这步就能解决问题
+ A8 ^' y/ S6 h4 q ?另外一部分情况会遇见如下情况
0 j# T0 m P% ^( m9 h# [" w: |& r
2 z; J6 Q1 p1 G; f编译器报错:, @8 c0 }: ]3 m) Z
6 c8 N3 C O! W; s$ JCODE:8 c6 y$ D+ g! z( N# u
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
2 C; o' J0 C6 h6 ]2 B. l0 q" A; a: r( O
产生这个问题的原因是库依赖关系:' _5 I# ~# k! n3 E& Q
在Project-> roperty->configuration Properties->Linker->Command Line0 x) p g0 ^/ i6 @9 C
加入编译开关/verbose:lib可以显示详细的库链接顺序& G4 X6 a8 A) ^
4 B4 Y2 j5 F+ ?3 W* WCODE:: f( P- ^' ^% }( I" m \
4 Y' m; o1 }# m9 D; |- B$ [
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
. A( u2 ^ q T4 p2 S& i' W& {Linking...
" X/ m, j5 t7 jSearching libraries% l& u% {' N& d2 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 J2 J5 q5 Y5 B/ v* k( c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( ]: h" Z2 k2 Q C* q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
; H! G8 U+ U# e6 I4 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:1 y, g ]' k0 [& ?7 {; D4 o- s
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj), i- V6 k |* [/ |5 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:3 o0 l' w* p: c% Q' c& t4 E9 c# r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:# M3 u& M& N6 P# h/ ?# z6 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:; ~, ^( B% |2 C" H) x% q$ f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:/ Q( G. R6 w! t, d% p: O0 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:0 ^7 B9 l2 J7 `% I, S( K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:) M5 z$ a7 i" m. L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
; f; {5 i+ t5 cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:7 D+ @+ p! d6 g( z2 N: j# U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:! U5 `" d: _5 B& L9 P+ d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:, Y1 h- O' {4 E2 o/ W0 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:5 i# D0 P5 Y$ a0 n. `4 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:* f7 d! r9 g0 {! u7 ^. S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
& e) s, O8 ?" vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
7 ~ s- K+ x/ z" [ e* LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
: u4 W2 r* F3 r1 r: `. ] HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib: E; L# R5 F3 R+ b3 ^5 ] L6 {9 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
& V. l3 B+ Z o' g# F) HSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:, i- f# X* |0 u8 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:( F \; |. W: z; |6 ^- a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
x, y4 B3 k: a/ WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:4 r. l8 q8 @& q2 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 S$ R, L) T, `- b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:; r! y9 q% U9 _, L: P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
- A9 Z9 z; u, d6 C" N1 p0 B: NSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
# O2 c1 D( }: A" {) R+ w: GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( [1 }, w+ @9 l7 m9 g, p! Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
4 Q" v2 w8 F# s& S& F( ~) ~& ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:* b" s& a( R" C( c( k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:7 r+ F9 P3 \- \ U7 R) n" z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 r. {5 ]$ g: g( _: qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:6 \1 ]$ T. F3 L& u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:, n" `) g" U- P# N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:% ?5 @# _) ]$ ~8 _1 |* @9 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
9 K( h' y& u" d; ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:5 g$ Q _3 b' L& }, v: M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
, T8 k% r4 U3 g' s! O# ~) C; U9 ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
' c' q% {8 `2 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
! `3 p* x+ G% e9 Q$ Z7 T1 C ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
o7 N# r; T! f4 H9 w. k! fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:0 |: h2 q2 I2 t' _; L) P: t* G2 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
' _: J1 r/ W" `: H& x- Z }Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:7 |0 S, B: \* J" w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
8 X5 o2 c. Y& G @0 q3 ]3 z# ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
! o& Y' Z' x( i6 V2 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:4 i3 O, A) G5 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:( a& }, ` y3 y! l" u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:. t9 e7 x; Z. }# e) K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:/ {6 [$ Z& ^* j7 I0 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! Q2 R5 u& y& @. y) f2 {% i' ~ F* r( VFinished searching libraries
4 u& T4 ?2 U: SSearching libraries
! j! C+ }5 F; A( VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
# K& a0 H \6 W8 j1 F2 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; J. P' }8 C; s+ m' \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
- |% y9 \5 S% z5 @/ w: ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
8 n; z6 h& ?/ m9 j! e# `5 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:# r7 j% P+ t; p# m; [: G7 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib: I' i5 i4 s z" c8 g0 e2 W' i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:" D% d+ N( k/ Y2 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:6 m7 ?* I3 w& V+ w% L# {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
( @5 v) E5 F: G8 f7 k/ B( f" f3 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
+ S: ]0 s5 L( d% w8 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 f; i4 W4 M6 t/ m3 q' p! B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:9 @5 l, D5 F/ y" k1 T+ e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:- C* |. t7 _8 I! r2 H" p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
/ T' B! s" h7 @1 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
$ @8 @/ G' q7 ?/ l* m4 V+ CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:: @$ k4 U. I4 @ o, d5 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
6 g3 W! u9 p: g* T ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:% o0 |: W, V( k' R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
2 P( \7 ^ p0 g' ~* D8 t1 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:+ ~- v2 T+ L8 y" F( W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:+ [+ |2 T! y5 Z" F( s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
5 v& f- P. A8 M1 q: g& ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:3 ^ I. ?- {- p: N |& E1 d. T7 Z" ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:7 t8 {# `9 ]. l: `5 i" c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
9 K' G$ X/ _6 ~$ T! j3 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' R8 ~2 {9 M- i4 _2 ]6 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
9 R- e* z q+ iSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
& |0 N: Z& p* \3 Q; ?; o5 QSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
! l. J2 H( ]2 Y$ A+ F" }3 cFinished searching libraries0 o, g7 h, _, E* K
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
\3 Z5 o5 I: i3 t" l6 @Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"+ g2 f( B- Z9 U1 }* g0 b. a
PerfMonDemo - 2 error(s), 0 warning(s)
' i0 q7 p9 A% o* c% H% e0 x========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========, w2 r9 O+ N" w! J+ P, b' f
) ? X" _9 s1 M. x- J& K5 O
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
" Q7 m Q2 x( g3 O* D解决方法如下:5 B- R5 U* z: ~1 s, v% g
Project->Property->configuration Properties->Linker->Input->Additional Dependencies7 u( _) Z0 X( ^" A/ I5 R
加入
T' E3 q/ @% {+ C, ]9 Jnafxcw.lib
" c) B2 e: G7 Y2 ~, q9 ~$ @$ dlibcpmt.lib, O% ^3 X* B. |3 E1 ?
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
) |' ]$ x$ i: [1 D* ~加入, e# ` `9 n$ B$ N0 W
nafxcw.lib
) l/ D0 X, m1 F! V9 ?. t6 i9 Xlibcpmt.lib7 l, z! U1 Q. b& T1 X0 I1 Z; ^
% S8 y1 ], u$ d$ n" l 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:; M# @9 c6 q4 c
4 }% U% q' B" U! L3 J4 e单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
* v( E/ h# v% l多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
/ q+ V! F ~/ K使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
5 C3 C7 b; a/ A, B; h/ j调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 8 C) V" l* u! R4 i
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
: |8 N. d8 h- z# ?* Q! A' n使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|