|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:. S$ B! I+ F/ R! E! G" C- K5 h, |
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
) c& S; ]: H, m- N0 x Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:0 I8 X8 a! f# k6 p( l$ D
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
: l. r' M+ t0 _ w3 e, _6 Z7 y v6 z' _
修改成Multi-threaded (/MT)4 F) F: Q: y4 _+ Z$ ~
3 S& D( O( A. v+ l# _1 C
修改了Runtime类型以后4 v2 Y5 R' R3 l3 N
% d1 x( Y7 K" j4 U& z需要将MFC的编译类型也改成静态库:
6 Y/ f/ I! _) r; y$ L. NProject-> roperty->configuration Properties->General->Use of MFC2 e% Z+ i4 s* N* p
修改成Use MFC in a Static Library
# l" k2 b5 {! ]2 V! r- |
% {* B& E) X, z' |8 r9 k一部分情况下在这步就能解决问题/ D& M5 y9 ?! F, H" y
另外一部分情况会遇见如下情况) z. \$ i% t4 E- f: z) B
( u+ n4 Q2 x8 B7 q编译器报错:
9 I+ V# u" r2 m/ p$ I/ D% I3 G) |
CODE:
. I- y( f" K/ K- c) _nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)( e+ A) a6 E! w' s
2 ?# C/ Y# B/ d( y! f产生这个问题的原因是库依赖关系:
3 h; l% ?3 b' g3 H! {! o/ p* D在Project-> roperty->configuration Properties->Linker->Command Line, D2 c6 k) K8 s. g: |7 B: z8 G
加入编译开关/verbose:lib可以显示详细的库链接顺序' N3 m7 `6 }9 c! E
1 z, K' N0 W/ @CODE:" }) [; D* [ z) u1 C N
0 q- P7 e& s8 H$ X
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------* x' a$ ~! v, n+ m
Linking...
N b5 f' t$ [9 r& W, ]2 WSearching libraries
, p/ B7 d) P: e( R. cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:- v! b m8 k4 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:/ V$ y4 a. J2 a5 @1 ~) |+ L) b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:, W/ b" Q7 W+ E2 p3 P) u4 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib: a* q( m% A* a. X$ G
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
- N/ d9 _% }/ M2 N/ W+ [' L* TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:; Z4 @) q, z; C6 L% p/ O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:0 Z S0 d7 `: J S* E Z; ~+ s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:6 G" L7 g$ |/ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:. L3 d) T! O' b) x4 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
& n# g9 k1 a$ u. j! V7 {& G9 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:1 {7 e3 z3 L/ l9 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
& ]) J$ f0 _- ]1 C$ }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:+ b/ S& P0 O4 K; N1 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
' F% u7 U% G) cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
m( A+ X# J8 c& p! J! |8 ^6 X1 f5 p# SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:+ Q, `' Q1 F u! f, m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
4 M1 q7 w' t. B1 X" F( \+ ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
& t# |+ T9 [. ^0 \, x# ^9 g; m+ X: Q& H# }9 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: O: F0 E1 t) j- ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
3 [7 I# ?2 y; y+ L" p1 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
; Y2 o6 p3 f9 \1 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib: r0 H2 x' C0 s% E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:. `# c6 P5 s4 h8 W' o$ O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
6 g, N$ P& H0 g2 cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
! L7 y: d: @% j" P" ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:- ^9 T8 P" s8 I, u# y, G! w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
, v3 Z& i: {( p2 t- V. { f6 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:) V* p6 f5 c6 _2 x) N3 |& b! B6 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
% H( n C& L& O" z( cSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:) g1 t( j( j' W& J) k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:2 ?9 V- D- A: n* \/ K; j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 w$ m# Q2 b% C6 ^/ `- \5 ~8 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:5 p7 N$ |; n3 @6 T+ _9 |/ s+ {: q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
4 x# r( Q$ U1 f. l, KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:8 D! g0 t+ K/ b" T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:, h6 X/ d& T) N5 u; B8 ~ ^0 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
+ y+ W6 E& z( K: cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:8 f/ ~6 }! N) ?8 b2 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 n9 S' ?/ O5 J/ lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:0 m; R! d# S' O- m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
9 z( G8 T- Z1 `; A; Z; Z. u/ a' s) YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
: R/ f4 u5 N' ?( W" v0 N: G8 J) tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
, y c, F Z+ ^, D, dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:- x2 {. u3 S3 c: J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:1 `9 k: j0 B0 b6 p4 R! v6 E3 N& s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
. t, {4 A9 a) f. g$ `3 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
* v9 U( R; D0 g5 ~5 w% MSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
: U6 r# m e# ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:; W) d, b0 `8 X" k' V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:$ I& U- R. r3 L& P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:' N% O% h7 [* b4 |$ l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. D6 E" g( o0 n5 V) |Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:& l/ @3 W2 h; R7 R4 \8 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( W' X2 g# c4 N2 GFinished searching libraries# Q. N2 e* B V; F5 Y
Searching libraries
4 E' S: v# X, U* \$ ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; j+ ^5 O9 @1 j2 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
3 G7 x6 _. @, x: p& |. x- ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:' C5 e! |2 ?: D! ~& v. W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
1 c; z" i/ {5 x/ M7 USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
) s' ]1 f+ w2 {! [" x9 S- x z: b* jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
A' L1 Y* J, l: q/ P$ m- x" u0 Z$ xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
. U; K6 ^; z4 }& A& kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
* i& O. r5 i* \; ^2 J3 P% F" \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
% x- C3 g/ Z D* r( [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
8 t5 x; Q: j7 b& w) c" f) ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:# H% D% P: G8 V. [5 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
& d/ b& t1 J- X& @ T9 U- c9 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
/ S. Z3 E% T5 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:; i, m3 t' A; U n# p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
4 c) h& a& \. JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:$ C3 s! B$ C- m% D( {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:, ]2 x$ q" v% M- H- V* s4 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:3 W+ a# O% C- z0 A2 I) C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:. \# q& R' T$ T) @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
$ y& O+ d/ w- z/ \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:. p7 q3 k0 z$ T7 R1 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
) @, V7 _2 I& m) XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:' v2 o5 u2 l: n' T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
, ?2 Y, a: n {8 G4 g$ \6 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:; q% s! y" R: G% h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
6 J. D5 ]+ M/ J2 k. WSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: M- v! t1 C& \/ G- o7 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: d& c4 x/ B( Y* \Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:. v1 B" s8 N; m( u6 l
Finished searching libraries7 g& [6 j7 T- ^3 h5 c- p
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found$ U' y7 F @1 W! w1 V8 [, A& _( ^
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
3 k- m, w1 m% v. [ [+ {PerfMonDemo - 2 error(s), 0 warning(s)
: e) U+ Y3 ` z# [, _* o1 c4 q+ ^========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========# W4 h0 G( |# H4 m8 J5 y4 {! F4 H
W! _) h P) D, N7 o5 Z% \" g我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。. H1 G" p& D. ?( {* j P! w( B/ |
解决方法如下:
0 u: n! B& Q! H5 ` A4 ?4 f" ^: y) }Project->Property->configuration Properties->Linker->Input->Additional Dependencies
/ T% i4 U' D" k0 h加入
0 A! |: L8 n3 bnafxcw.lib
! Y4 f( @# ]8 f6 W( m8 }) Hlibcpmt.lib: j0 l; E3 P* {- B: ^0 }2 ?
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
& N% V* c; |2 [7 N( y" K加入
8 o$ o: R/ m; `! j) l3 n( [nafxcw.lib Y; a/ W& d6 a8 i" W
libcpmt.lib
9 ?) w' V2 H2 ]5 {/ B
% u {; L! ]1 x% Z1 _0 x 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:! `7 L: @: T: M8 e, f
) q4 F; @6 e2 v* J6 |) K6 a* w& z
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 0 p8 u+ A7 b P3 a2 ?7 B; S" W$ F' s
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
' N! u& E/ {+ f. c) z( J, N使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
. z0 z& D" m$ [: n+ o* ^+ I调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
$ W: e$ J1 R. D1 S/ g) C调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib * [) X0 K* t3 J6 ^7 O2 P/ I
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|