|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:, I# g3 s: {+ W$ N
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。7 E( j7 ^0 b9 g7 _& J5 G% u% ~
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:) ^ T: H$ Q+ Z& l! [* O" Q
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library4 |) Q: i8 Y8 I, ^. [9 ?
- s* |/ y' ~. J7 P; }- L8 }7 H修改成Multi-threaded (/MT)
, J0 _1 r) X' g0 M: X: F4 V
! G) K6 Q1 ^' W' e9 c+ O4 A+ b修改了Runtime类型以后. M/ x6 A" a' a2 X
, U6 b% y( I) f" ]: `4 L需要将MFC的编译类型也改成静态库:
# y# i8 U# u- N* r! O: m7 eProject-> roperty->configuration Properties->General->Use of MFC
7 X" _4 [0 [) R$ N; S0 f% R修改成Use MFC in a Static Library7 r. N" O& R2 @2 F8 O/ M+ p2 \ x3 e
1 |1 Q' y3 `7 D8 \$ n
一部分情况下在这步就能解决问题% z6 [! ?5 c5 @3 Z/ k3 b2 T( k
另外一部分情况会遇见如下情况: C3 Q8 x: R# ^0 Z, _ z
1 ~( i; c. l/ M8 h( ^编译器报错: I* G5 X3 ?" U. P% S% Y* Z
/ E" Q0 y! `+ T
CODE:# B8 C5 D. x& f( w
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
" M% ~& T9 N* F U" k+ @/ g, b1 k& H! z) H' a2 p
产生这个问题的原因是库依赖关系:% S9 A9 @3 I8 e: h0 x% U$ P6 q
在Project-> roperty->configuration Properties->Linker->Command Line0 n" h; Y \. `" T9 @; g7 s
加入编译开关/verbose:lib可以显示详细的库链接顺序- R8 T% U! d% h
J0 T& q; M% ^' j1 ~0 m$ {
CODE:5 a/ A6 a) ~; R) ~
- ?5 w4 b5 d" `5 V# |1 X! M6 ?0 S------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
6 _4 t% d( A8 m# p3 k& ~Linking...9 S, V' \6 V8 i; t4 V; N7 V; K) `
Searching libraries8 a# h8 Z$ I$ C3 `; a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:: b9 ?! f% T0 h" n% {2 P$ F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
8 h7 u9 V N% P2 s/ USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib: ~, m$ J& l! I9 q" t' Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
0 J) S5 M5 n7 M% I. V! Rnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
7 H$ P0 q' ?) k% HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
T. B) d+ ]7 o) z) rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 F6 x' T1 y/ ?3 q1 L% ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
9 h, p4 N- M5 P$ ^& ~4 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:% h2 K' k& s0 a" |9 V. `/ t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
* K, k2 u8 Q5 I7 k, A: sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:- C5 i3 s' \& @% n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:( E/ \4 s; O: O1 h- M; w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! q6 N0 o% l! t) C: W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
# U7 u Z7 A5 `- x& ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
0 K- u n+ y) T) O. H* R# HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:5 r I F+ _7 Y8 T/ x( B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:# V! O3 [5 D, u3 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
: F" q& R' T$ qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
% R# N' Z9 ~: C- ]# i+ w2 _) Z6 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:3 _9 w5 u+ p+ J" n3 y$ ]8 x h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib: J) M, S8 v4 L5 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
( ]; y( w" y& U4 h! A: BSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
& ]. z) `/ U( _& j$ P X/ a3 Z) h8 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
% b0 G6 i, K {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
. U: b9 O+ P/ D) `9 D& V0 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
, N# v& R: [( }7 s5 I: n; {( FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:1 V( V4 x# ^3 y$ P7 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
# H4 B7 e1 v2 M' ]7 k9 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
+ S8 C; j0 m h0 q* o6 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:; K: N6 p% d" `$ ~* E1 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
! ~1 ^' F9 q% a; G/ Y( Q& S& U. PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:8 J* [0 h# n( _! }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:- \" v. q* @( e E3 J4 x4 m ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
; b* m1 O: ?9 ^ K& YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
9 l# Y8 }( \' r+ G) pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
4 A* ]7 ?4 ^8 `% j! k/ x& ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:7 C- E" e8 g# ?# \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
5 J" W, u: T& m) Z* O% r; dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:7 \6 H2 k& e+ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:& Z( M+ m( B* S8 ?# \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
& G! Q$ N. {, L0 g+ CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:* n0 D; J" _& r9 I5 N9 e9 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
. O% S s# L$ X$ A+ KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
5 S. i- j; ~6 b/ H! CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:7 l- {4 }6 d3 A/ v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
& i* ?1 b) }1 \% }6 }5 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:! Q6 F( Q7 _+ `; n5 x5 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib: T- d" z4 y- k3 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
9 I! F9 m& z! H( Y L5 G9 j! Z) fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
; k K6 S% l, ?$ U1 A8 l) kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
. h/ I2 ?# ]& |$ t' L. {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) B" e' x l( H0 L! YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:7 u, X" [/ _) U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:$ W& C2 G; R) ~
Finished searching libraries
9 P8 z3 y3 |8 C q+ f$ v; f2 ~5 HSearching libraries) g& M! ^( q! \7 f s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
3 w# I: h9 x, U4 d: G& HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
& G, w. @: {& `2 ?: FSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
4 h3 }0 ]) Q- V) V( zSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
4 o/ u, P- r. f1 n9 X0 a+ A! P( R) [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
V. P7 Q# C+ ~% ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:* X9 L+ U0 N) P3 J7 U2 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:1 ~8 e- M0 G+ V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:' D8 c* D" r d" O- A [9 M; X/ w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:$ m/ ?' r j D- N1 ]( X/ ^% F1 L3 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
3 w- ?/ n( H' d5 `2 a0 H: ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
+ o4 |' I( ^) G) TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
1 c; R$ j, n ]5 u7 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
3 F. Q$ f! \9 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
# N @0 A+ J) I# {0 n: K: R, GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
; f# s! n4 i: ]1 Q$ H/ qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:1 ~; \7 U5 `8 D5 P( P! R; o: J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
# |5 C# c- y" A! uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
; F3 m2 G6 o7 g3 v$ E ~" RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
' z( m" y1 z- K. w9 J) ]) w4 \1 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
& b i1 U6 G, VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
7 r* C% e" z! J$ b7 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# J. P3 [/ a! b/ o E4 _/ L7 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
8 f/ v/ v% y9 b1 X3 y! r- N0 J3 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:4 K. ]& V7 _9 _+ E# I" N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:3 S/ j5 S: e0 R( s8 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:; Y2 j M( r# D/ _; a/ J+ Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
4 G, Z2 B: ? y q; c, O0 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 e G1 d) ?- `2 v" L' f$ {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
1 Y3 _. |* h, H4 c s4 @( tFinished searching libraries8 I' A, u6 a: z+ J! S+ C, p
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found9 K! a( p# e# W& J: G0 \' w* A K
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"$ ^' k5 z/ j. b* C1 h, q T$ g1 u
PerfMonDemo - 2 error(s), 0 warning(s)% a0 e8 x! \& B, O5 p# h8 G6 |
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
; j: r# w8 j+ U/ f. j2 }8 F' H- n, j) {$ \5 Z' r' H
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。! v& S% h: T0 v, j
解决方法如下:- i! a6 U$ M! v6 G, g! E
Project->Property->configuration Properties->Linker->Input->Additional Dependencies, f S+ Z- O% u
加入
/ g; j. ~+ u2 R) {- l* z7 Bnafxcw.lib
! u3 y6 `; i% y0 Z/ ulibcpmt.lib" U0 J2 z3 Q, o: s
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library+ H0 U2 L' |: J7 n
加入 ]: r u p* b) k8 ~ p: g
nafxcw.lib t3 V& u# b# Z
libcpmt.lib
, J( p/ |) N5 G/ A/ J0 K4 g s* t+ o1 N9 F9 Q
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
9 y9 Z1 I3 Y4 E F
" d. e; |9 O) S9 u2 K单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 l. E, [4 W. C; w, V% {
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
; n1 |/ ?( N3 `; I9 |- E: a使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ) R$ M5 t* V( I# A. o/ F7 Z7 a2 z
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
+ e. `: F+ U( J. y# L6 N; G调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
5 h7 s3 N' N) L6 _! D* J使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|