|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:/ H7 ]- g7 a9 V' R
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。- T6 j# V8 E/ D# ^8 |
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
$ j& x% v1 O" GProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
, ]9 `! N; D( _% l* I% |" ^4 Y% ?% F8 u: }* n `/ E
修改成Multi-threaded (/MT)
/ {9 q; C9 V: z8 X# s/ S% K% }/ d( f* [& x
修改了Runtime类型以后8 L& M1 ?8 A3 c3 L1 H# x5 k
. r" R9 M' e: |1 k0 O2 B4 F需要将MFC的编译类型也改成静态库:% i1 s" n6 I$ F2 u! p
Project-> roperty->configuration Properties->General->Use of MFC8 S& ~5 Q: r4 m$ I
修改成Use MFC in a Static Library
6 ]& I8 J7 T6 {) d% ~4 j" N& u4 G8 H U. \& d, [/ i0 `
一部分情况下在这步就能解决问题
/ A; K# G7 ~ B1 x7 ~另外一部分情况会遇见如下情况
- {5 \# L' b. X8 l+ M4 b9 x& d2 N2 X+ M4 s0 n
编译器报错:0 N0 R8 l/ T9 [- ]: R9 R
, ? \8 }7 M$ w3 ]7 {0 JCODE:
! c" A1 l W; Z7 A5 K0 Ynafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)0 q* H4 o2 i' C2 L
M) d7 B. R2 u) v5 ?
产生这个问题的原因是库依赖关系:4 q7 N& h/ \# d. E6 q0 @- z
在Project-> roperty->configuration Properties->Linker->Command Line
' v1 d+ x: t; n) Y0 T' `加入编译开关/verbose:lib可以显示详细的库链接顺序) _/ r' N( k& W6 L! `
- S+ ~; v) Z3 H: i
CODE:
2 _6 n: e& ?) R* e
! j+ o/ A2 B) i) d------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
$ U+ n3 Q" w J; d0 K' B$ L% O8 CLinking...
9 g/ _" n: D: m1 f3 X, TSearching libraries/ g6 j5 y# k# a0 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:$ Q+ Q( C, S: @: ?/ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:7 k+ i8 u. P" ~! `6 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
$ ]6 e' ^% ^) ]+ D% ]. p6 @7 |, \% hSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
3 U" ^' L/ X! Jnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
G. u- I I J- hSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:- A: G! r9 @2 E1 w3 D* g0 k9 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
3 i7 T0 @7 S) O. J' BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
$ J- ]* _3 B; j/ F1 a4 o4 i. p) LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 g K6 M- [/ i! n0 c2 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:& D5 X J* ~& z1 o6 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:2 n; |1 ]8 |4 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
1 p% m; |! E# w6 R' aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:2 ^- e" e; g9 w. ~! E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
4 H; Q; ^0 N4 d, ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
* @" ?7 y1 @* A$ I! XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
+ ~& y k g; `9 _. _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- \0 C3 h& ? n8 \* L4 Q; b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:; T; k' z+ K$ G6 X6 k. p- a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:" y# J) |* {8 h2 G( y" g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:2 v/ d- P1 N' b' n# O9 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
. A3 s* v, w) ~# ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
8 G, ~& C& k+ [& f3 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
! R1 _ s: {. d; L6 C! CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
4 u, U+ _. z% _$ eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:& k. i/ y: S/ @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:3 F4 T! H/ I1 A4 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:" O N! m6 N$ M1 l4 P/ y- P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:' g) b9 q4 ~9 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:& B! X ]* M: \' D& [! Y6 F _( Z- N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:7 o9 t$ E8 t2 x Q6 y# R3 U& D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
2 B* _- a h" z7 T- d1 c3 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:- z0 C8 x! N9 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:- q! e. A( J; c) j& p) Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:# a* a+ ]7 F4 n3 ^# k( ?5 [& Q6 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib: a9 |0 u7 {) \8 h' o! y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
; g) \ T1 X/ ~$ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:7 d% a0 h# [3 f% l ]6 t* K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
2 T# l. o, X7 g- b! x# ` uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:7 R* T$ H% L1 J3 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:; H# `7 u: y- h r; v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:% H3 G+ S/ d O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:! W W5 n P- }! O' y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:5 b; \, k# {$ N- C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
! S& n* M" O! `4 ~7 G* HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
/ Z6 `- ]+ I! @: hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:2 c2 b6 ]* i& M3 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:# i: H/ w$ x9 v2 H5 _4 [6 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:& t% b8 `$ j4 }' n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
! B' w# Q+ [+ c ~/ ~6 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
* g6 w: v J* R5 t5 i- c# K5 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
( m+ N$ s* o, s. J' ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. v$ \- \5 w, Z) Q1 X* w8 S8 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:9 z7 {4 w3 q; k D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
. I$ w4 \2 j0 u9 GFinished searching libraries+ P) o8 D, R' C
Searching libraries6 V. D: l" t( h# P5 c; _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:. M$ [* r6 I6 H0 {! v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:- J+ M4 }' X& h( Q1 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 H" \0 h: y- i' `Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
. ]" r% [; r1 F* z& ~: T6 pSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
5 b# ~: l- }6 ]2 X0 }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:# b4 l' y- V; t5 j- Z( M( m1 V% c$ }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
4 p2 |- x; r `, ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:7 T8 I! Y8 c1 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:4 u) ]; s& I+ T/ h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:& A% v$ q$ { G+ w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
/ a5 h; X" V6 P& H* ~: QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
$ Z) J7 \+ ]; y& S9 v5 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
2 a+ ~0 x3 K! Y" g4 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:! D1 p7 \/ d: k4 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:# X% b5 x' r' U# |4 |5 Y: Z8 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
3 W! c v7 V- J" m$ c/ a* W+ D7 l0 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:3 Q& q8 u3 @5 M& B! \* C7 x/ E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
$ f5 E' Z2 }: t2 P+ a2 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
* |& m% r# ?& ~' K, G0 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:& n4 t/ Z- t4 ^0 D% n3 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
4 F0 N7 c/ w2 y- r. q# E2 O. mSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:- t1 d" T1 u$ X4 d4 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
% ~/ {4 z) @& H! D& E4 M# }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
7 ~2 H" b8 D7 B* vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
% k, y, |( S! L* n) `& Q( j5 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
/ R- n( ~4 u; r$ `$ F" a g, tSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
" G, Q" `2 h" Y* c4 p& `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
0 C6 Y) B9 a L3 v% B& r/ g- oSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
$ n6 F! ]& @5 a. ^% K1 d$ S1 k% NFinished searching libraries: i7 U; r; H! J% g- p# M
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
0 [1 x9 t K; u+ W- a# OBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
( H( t8 g( y0 v% vPerfMonDemo - 2 error(s), 0 warning(s)
; p) O' M. b+ y8 g5 }* k8 u( w3 S========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
2 |1 Y9 e. Y* K! U# X
$ i( y8 ?! \4 q5 B我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
) \5 V) t7 J# |& D' h: H解决方法如下:$ L5 S) a* M8 A9 G4 o( p
Project->Property->configuration Properties->Linker->Input->Additional Dependencies! `/ c$ A& g7 Q) }# ?( K+ X# r E/ c
加入
; _; [5 ^" R/ {1 Knafxcw.lib9 a5 c0 G: V! P+ O* B
libcpmt.lib* o( D. R' F1 t& P
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library, D* E% ^4 u7 c7 V8 \" Y! M6 @
加入" U/ l4 \% y% n' R" s6 Y/ K! m
nafxcw.lib. C$ G" T; x: |4 f: _" {) \
libcpmt.lib. A2 r4 V! a- X/ z. u
/ F, K8 `/ I/ I/ T9 } 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
, r0 J6 C5 r" u }& b& g/ X, y7 ^' s$ R* j7 q8 u# O% `
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
% {! X5 d% c; M2 @, z& Q多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 8 A# T% f/ }% ^ b3 @" ~
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 8 U- @3 u' k- P6 G6 S( x
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib # X$ h9 O9 m, u6 M- c; R
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib ( u2 j- V* Z4 K' `4 P7 x6 n, B/ v
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|