|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:) P- P" f) I# p5 }9 K1 G
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
+ ^% i! ^" x# U# ~; G' B5 U, d Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
; R$ c+ v7 Z; `( ], ]' y, NProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library6 M C" ]3 t/ N, j& g1 }+ x; H
0 x& \3 U W1 U- n' s. r3 }
修改成Multi-threaded (/MT)5 i) F9 G( o# b z8 ]
! d8 U) \2 c% ? s; I7 ?9 A
修改了Runtime类型以后
. D- j4 E7 z8 s- w1 I. z; V; C& {- p- Y% A- {/ l, c- b
需要将MFC的编译类型也改成静态库:
! V$ z/ u5 I9 |2 o% F) m" b0 MProject-> roperty->configuration Properties->General->Use of MFC: \0 g @- h$ ?" f5 {/ D" o( F* w
修改成Use MFC in a Static Library& r m7 J$ q* C! d1 y$ i! c
, i; ^! F: @/ V& s" ?% j# B一部分情况下在这步就能解决问题
e" f. q. p0 n! c3 ?9 e6 S另外一部分情况会遇见如下情况
# O: Y. R8 r( |8 d/ N- A1 u" }. }# q/ j5 Y% ]
编译器报错:
- o+ {1 U5 k4 R3 |" G: }# x, `' F2 e6 `. ]1 q" p
CODE:8 s, N4 B9 T" [8 O
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)3 J- J& K# ?5 ~, i, W7 r! }
: `( L% i6 [5 ^/ b p产生这个问题的原因是库依赖关系:9 W1 s0 J' v% H1 ?2 |) J
在Project-> roperty->configuration Properties->Linker->Command Line
! Y. x8 A- W) ?/ s3 N- h" _加入编译开关/verbose:lib可以显示详细的库链接顺序
/ @! P. v0 M- X
: A8 q+ j6 v. L" L* X5 C. b0 x6 DCODE:0 `9 Q6 W. B. n: J6 V
, Q6 K r4 C4 J1 x5 u9 ?& Q- l
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
+ Q' y# P; J# `/ P* m5 J8 f! p! aLinking...
! M3 h2 `6 v/ {" w1 ^Searching libraries4 h8 | j5 |! p' I2 V1 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 M% X6 q/ d, G) g6 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:4 G8 Q+ `* J5 E6 r% o- U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:6 J {6 C; u* ~8 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:' |1 W! F6 \! Z" b( W- ?
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
+ [3 m" Y- C# j' }5 Y2 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:" X: q2 |' s& T6 P/ M4 D* I, L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
- k/ Z. ~! P6 ]8 q4 b/ U1 j+ }% ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:' E9 s/ V) D9 |& r& ?: r5 L5 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
- u1 S/ M+ l4 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
5 T k$ s1 e* F$ V9 J) B) {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:4 R) m& m; w6 N' H, y" a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:/ m6 |' F; q, P: I: S9 J( ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
" R8 U$ Q( T; K( e/ D" l/ ]3 |+ iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
. |8 B& w4 @1 z( S6 d1 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:" t% e; `" p8 K o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
; ]$ o+ B4 L, J: T8 a/ uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
. B8 Z/ ?0 y, kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:0 U. o7 L( T" t- b, z u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:4 W1 J5 ?8 [8 b+ }. ^& O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:5 { o1 D) T( U; [# g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:* k, F3 u% L, L4 p0 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
& u2 t8 e' N1 R" n+ K' t/ [. r+ O' {7 w- oSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:6 a" j) y. P. v# m, U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:# a% I. p0 v- G/ U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
# {$ b3 N, {$ H c* ?+ J4 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
# v* g: P/ k8 \& p6 cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
5 a; C K3 l9 _2 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:' U: T. n& A2 s/ I4 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
0 F) k! I2 W/ S6 q) ]( tSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:5 G( f. n `9 g3 |: y9 a# E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
7 X: M1 U+ l0 B! y# \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:* D1 X2 `( d; K& t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:: w# A8 W0 ]: T% A9 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
. m' y/ k9 ?2 _' XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
) k/ i, U4 x- E+ E: U9 X. BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
5 U. c# a" ], {) nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:6 x; `6 ?8 J6 \: J# q6 Q" N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
- a: M z) [+ u8 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
+ ?! r$ D* O" ]2 x. C- F. |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:, T+ `) M) c7 Z: Q, q( L) Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:. \+ e- K S0 b; P l3 b6 _6 e% D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
6 F/ A: _; } b/ CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
' s: S; S# f- l( N, gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:7 g O$ Z8 r$ \* k b' n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
H4 a8 G1 s: T* bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:. e8 Z& O* Y0 X+ r! v! s( z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
* R0 A1 x! b @ H4 H) @; USearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# z; T) p, J' _, E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:7 ?0 [& i k, r: ]9 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:4 a* V; i p9 s; u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:1 I+ q- {5 {9 T% v$ _+ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib: P5 j2 [' o# A; P/ I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, t5 M, k6 K; t: u, w0 y# |5 F2 Q' cSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:& W% [1 W& u9 {( \3 z- ?* e3 S
Finished searching libraries
* O; z7 F# z8 c5 @) @% dSearching libraries
) i j$ T, U' d3 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:/ ~2 y9 c2 `0 }6 ~& I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:& d3 }/ R" a" d- J. O# {$ I: F! h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:4 G Z% F8 I6 ?: e" E7 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
- \3 U& E+ f$ u9 A% f( Q& B) mSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
" G5 P- q4 a7 cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
/ I1 i+ m5 k, D$ x O3 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:& B2 e" o. Q; V* |5 r$ Z2 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
* L5 B$ ` ]; e" J: j: t* `6 ]' R# U" F: YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:) u1 g0 ^: N# B$ |( c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
& _. ~% l! J5 f- @) iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:; [8 R- Z0 Y1 c. c/ w0 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:7 B- v+ {$ }1 G, U8 l' s7 ]. n- ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
7 }7 O6 I; x( l1 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
# F) V" g. r( i- Y) {% RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:; {/ \3 H5 s! V2 ?$ ~) Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
, W% f3 X* [% A2 \$ A$ bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
1 e' A5 K( w- \4 p1 w- y4 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
4 `+ S8 Z9 T/ \4 pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
+ \. _. E7 a3 S- N8 F- pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
/ g- V4 w! F8 ^" z6 R% k9 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
9 D, S9 I8 e2 B9 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
6 F S' p* K' zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:2 L) q$ ]% E5 K& u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
/ u# ~ s; j0 ^, L4 ~9 x2 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
5 K" Q( Z6 B+ |7 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 ^* N% J' v/ m) e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:# Q" D8 Z, Q' U' s3 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
. H" t. l. R6 j+ A* E* C* \( iSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
. ~1 e: n [$ QFinished searching libraries
$ E6 ~8 Z9 S; [; N+ s: X1 t& h) C# w.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found& K p' g- N2 ~
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm" c% x5 l/ @0 l% J
PerfMonDemo - 2 error(s), 0 warning(s)/ l$ T3 G: M3 A) W9 |' S8 D$ m8 \" A
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
7 C3 z" C* B* e- A
, c5 I; ]& v0 }9 t' c( p, Y我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。- B# o0 V' T; T
解决方法如下:
: L2 S. Q9 x! M; f1 d$ jProject->Property->configuration Properties->Linker->Input->Additional Dependencies' }) a- V, R. K$ p
加入; v1 M& ~. n4 L: N) G6 _
nafxcw.lib1 V# H0 z- J0 C2 T0 r0 X
libcpmt.lib9 H9 M- I- [+ z# `3 o
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library8 W+ }# y' r' G3 M8 F& v
加入
$ S. G/ w( E. ?8 s' V" rnafxcw.lib
, x0 u. l+ _/ f4 P, `libcpmt.lib
* d% v5 O" w; i( R/ B* d1 H# l# V K$ q3 ]. i
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
) x0 G! N% [1 ]0 h6 y) y# r6 W9 E4 N8 p. ]9 X
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 9 y, i3 B8 p B
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
/ s( s, Y; b( P8 u: F使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
+ i0 Q4 R( ]' g8 K, y: F6 C" V调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib * b' [7 b. [$ R" J; \ W7 ~5 _
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib ]2 n4 {! D+ g% S( O% ?
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|