|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:8 B6 v$ `7 c6 ~* c/ k2 R" M/ x
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
6 Z |# g* m( _9 P7 g' T2 y Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:& W' _( W4 ~7 Z9 T" M
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library$ |. D- E' ^+ B& r. i4 a
* ]. A7 h1 C8 y5 ~: ?修改成Multi-threaded (/MT)
. e/ P1 B6 M$ U% G$ p) {% ^/ P6 v! q4 g! ~: u# I
修改了Runtime类型以后
' F u! T: g, t: S
( f3 D7 C+ W* n' ?% T需要将MFC的编译类型也改成静态库:
4 Y' O G; d: i3 r$ XProject-> roperty->configuration Properties->General->Use of MFC/ J# G- o' E$ W; h% T( u9 O
修改成Use MFC in a Static Library
' H4 M3 }/ M5 P1 E, d$ l# d( N" F2 k% c
一部分情况下在这步就能解决问题. z' y9 f7 N8 c
另外一部分情况会遇见如下情况) L' O. V X2 C* Y: u' n Z
+ M6 e- l3 z$ f6 G- h K: V4 [8 H
编译器报错:/ V3 q& e7 T6 [9 Y1 Z
0 _( W% Z$ A' z# VCODE:9 n! M# e* n& B8 K5 r- D: ^) o$ b2 F
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)" C' k- m O# T4 K) Q
( @$ T9 J* D8 F' ~+ u产生这个问题的原因是库依赖关系:
6 ]7 I- d3 o; u4 d在Project-> roperty->configuration Properties->Linker->Command Line' b# w; c, K2 P: N3 i2 A
加入编译开关/verbose:lib可以显示详细的库链接顺序
8 a* [ l" Z# d- G, m: }3 a3 v6 _) h- ~' e+ l, G. B
CODE:
' T2 Y' w5 g9 p% e0 W
7 @1 o! t$ Z& i4 ~------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------9 A, ^) P* i2 o* Z9 n5 s {3 s$ s
Linking...
. K" p, s) e* C0 f% D2 JSearching libraries# F: B8 f7 z* w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 _8 S1 L" }# o" g @9 t9 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
9 q8 N! X/ o6 o4 s# {9 T) D3 u. HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
3 Q* z% p4 P( f* tSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
3 Z9 D7 s& L f8 P# Q( J3 lnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)$ l; p( M! \7 ]7 k9 y$ A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:8 z' u' j& R r+ g1 M/ [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib: r+ C$ A7 S6 i% G5 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
7 r M" K U/ {& R, k: GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
/ o/ i: l" S+ W1 }& ]) n7 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 ]- x6 M% e6 r6 |9 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
+ m' ^2 W, R! ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:# R7 m( w8 y' |5 r/ f% g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
& w) W7 j" |& eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 f' ~* Y7 V' cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
9 p$ t$ D. x* n- \, Y# iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:* T. a, K6 d- L" i9 @ k$ l, b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:. G6 Q* G2 N) `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
' V$ W# n4 b+ f8 X0 C5 U: J" Q/ YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
. E! |, s0 s; s4 y3 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:: x# n+ u" r: l. C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
1 N# C4 ~' E- K' h) m4 ?2 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
_0 J: j Q B' i( i. BSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:7 e, Q' i0 M* g+ R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
: g9 X" x! Q' |8 c3 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:( y2 E% Z2 P5 E# z* @" w" D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
1 b% p/ F! L9 ~; e2 Z, J; [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
2 J0 v: m1 S3 i% |% wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% U+ M$ V8 N g' r7 Q2 H- t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 v, \; {2 V+ e3 B# y* ^# @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:& F7 W$ p# T8 ?$ z+ a" C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:& m% n8 d5 r: X! w8 E3 K: ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:, G5 P% k+ n- f* S( D/ B; h( N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
g$ ?. X5 p( q$ J: ^* w6 V; NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 j. [; r$ K/ X* k6 U5 u2 I3 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
" M% O+ D# Q, QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
. Y) G% u- {4 d+ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
5 e0 W# z; q6 f/ R& jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
: n" }- C6 m' P4 q" w# a% v. lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 U, E o& }' c' G, TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
) U' m& n, n4 B& }7 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
# A) z/ Q% M6 q8 v4 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
7 g' X9 B4 }* o0 ^2 {" j) {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* O9 v* K& e# V- H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:. Q3 q# A( w+ O& C. l* N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:% y# ]' ^* ]7 q6 `1 _/ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:( W2 o. ~7 Y N% y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:7 z; J7 @) a8 [/ ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
7 | s, o, A4 o+ F8 L) Q4 E& Z& l' QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
) N9 t# [/ e" pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
' i! U: |4 p! W. B1 r% a7 R N; O$ M) Y/ HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:* H: K4 b1 J% A8 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
+ U" E2 k+ D- m& \. z8 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:5 n$ T4 g% s, C: B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:+ _0 w0 n6 a4 T7 J
Finished searching libraries- I( i5 H! I8 ]; B
Searching libraries G& }# E$ u- i @' [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:: V( W1 y- A8 C6 U0 V" y) I0 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
: \* ]! X5 o E; F; `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( k3 [; q: D' M) _4 ISearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
$ V# f2 B" Z7 ?2 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
8 P8 u" } u% C/ e. }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
2 [' P: B* J2 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
8 C- t6 g7 W' F+ y- gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
# W1 [2 t* U9 g7 _. l3 m2 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:. |9 L+ ]! e5 w/ J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:0 I0 e; V0 |! D) q% x( X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
+ z2 u w+ [3 U* o" p. xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:, z' @" }6 t% ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
- O. o, u! o8 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:- H9 V3 F$ `5 f4 A; n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:5 j0 V5 }: N. P8 V& W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:! O- L+ a6 ^4 L5 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:) r* j, z# [0 i" ^: h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 p5 q1 M. ~: { R7 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
; V) I. r3 T( l5 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
# W+ b% B+ }, R9 G' d0 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:1 k3 L8 T+ b4 X+ a* Y6 B& D+ y& _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:! _2 h9 Y. w- `2 f; l3 M. s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:0 i5 T2 X$ j8 b: Z+ b; d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:6 ~( ?+ J( B% T* K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:0 y; Z9 N+ j% ]; F: y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. N2 U9 u5 a5 i1 d- G8 r3 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 Y6 L u6 Q8 u1 O& Y' y# @7 w6 N7 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:; T8 _! l k* S3 w% n7 I. `) K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 L" S, T: ]9 }1 x: g& H
Finished searching libraries8 A9 w+ U; L" q3 M- w* P2 a7 ~# y
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
1 E( F( ~3 o4 m0 t( r8 \" rBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"2 p% D0 @0 _8 H: E' S9 h* r7 u" }
PerfMonDemo - 2 error(s), 0 warning(s)( {! C; q" @0 r
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
1 [+ u; k; @) _) ~& U; l& G& Z. f. T9 b: S* Z1 k( h3 h* C/ X
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。- r/ y% `! f3 b. j8 \: o) D
解决方法如下:$ `7 U* B& \, C) `2 b$ T. R
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
6 I% X s q$ a! B加入" a1 f1 _9 ?- J* j$ Y% s. g) W! ^
nafxcw.lib
& ]4 X6 k i# J" w9 Klibcpmt.lib3 Z+ L, |; ~+ \! h. p
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library2 a# P% W" A; R/ ~ L
加入: n1 X- x8 g/ i! H
nafxcw.lib- Z, g: }% o6 _$ @1 M* N& _
libcpmt.lib- O' _6 V* H ~* n- d- ], R) n. J
4 l2 E% g# `; v5 D 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
! K" w6 Z: k( R5 J
8 E: d, s( p# F; P, U, C单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
3 \( j+ S3 M+ r8 i+ C多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 `+ q4 H% X$ Q! U( Q$ i
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
2 s) G8 V- F2 m" z, N; [$ X调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
3 L) _! V% c0 r/ r调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
- u3 g# j3 L/ Z- V( Z3 a使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|