|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
& a5 @! i6 o2 ~/ n# I* H- F" a 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
# n! U7 G; F6 V( y: n Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
$ |4 ]: K" j" w3 L PProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
6 `) G; V" g9 x8 ^% |$ D& G: k' Y. S |( Z: o* e0 y0 r8 b
修改成Multi-threaded (/MT)- A1 z) t6 N- O; m& \: a0 O
) z |& n1 y' r
修改了Runtime类型以后
# Q0 W: ^' y) ~
% Y4 s6 [! l3 a$ g需要将MFC的编译类型也改成静态库:3 c% ~$ S0 D& P. W- a
Project-> roperty->configuration Properties->General->Use of MFC3 ^, Y$ z: V4 k4 E/ w0 O: H! g
修改成Use MFC in a Static Library( r9 ^% M3 `7 ]
E4 L) j% c/ C: p
一部分情况下在这步就能解决问题
0 G8 A5 S" h( F7 ?另外一部分情况会遇见如下情况
) m) x3 l/ T8 P0 n- o
2 w9 D0 N: ?, X. B, N# e# S1 `) G7 _5 I& \编译器报错:
: c" J+ Y, p$ O8 H. c% l
8 h$ v$ r) M4 u: r& v8 L3 ^8 vCODE:
' }$ Q" R; w% N& N# Z4 Z; [- Nnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
1 [" [8 A5 E3 s+ D; }0 N
* M+ T* R$ I4 e5 W: d! u产生这个问题的原因是库依赖关系:: F: N1 I/ O3 k- ~0 g- e; S& J }- v" r
在Project-> roperty->configuration Properties->Linker->Command Line: e; G' K# l8 |$ R6 _8 J
加入编译开关/verbose:lib可以显示详细的库链接顺序+ A' l2 R, I8 H, ]( e# R
& I# S" n8 [+ Z
CODE:
" A( ~& D6 V& D, R- k' C
5 O& s7 A; A( z' C2 r j------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
) A7 ]$ d! _: N/ P" L8 ^Linking...
7 k% R0 f& e8 ], D, rSearching libraries; @% W" ~2 m" g' A- H8 Q6 l# d4 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:! ?- `# K& V! ~9 y7 k' l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: D% A) C3 X0 R) B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ }/ e" h, c5 {4 X* Q! ASearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
; b9 G0 C- |5 C- Q; c: nnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)" u( s/ t& n! t- H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
- ?+ v3 p* E2 P- F( V( p7 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
! s% j7 i) @) kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:# O, c, W% M6 j: E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
) n; K8 |5 K+ \; N) FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
- N4 V, w( x7 T4 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
+ l W! }- _7 `+ s: E* ^0 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
* C: x. u# e( ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:. O& d( |" }- l, S# C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:1 u8 z7 N8 I6 b% P0 c7 y2 N% E& n# ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:# K7 S' c7 B4 Q: I N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:8 C, f8 I I4 D' n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:# U# Z' s2 C% D/ G0 y) I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:& ~# a( K6 |7 `" \. D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
2 e' `. V! Z3 g9 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
8 T7 \* R3 J0 ]* h8 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:6 p" s8 f2 L" w1 }( {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
% e; _! |! h, Q! |9 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
& \% [8 n5 X Y- H: Q8 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:6 a8 Y9 K4 o; \! a4 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
( G; R, o: e5 j+ B# F. x3 o% d4 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
9 ~ s$ v4 {+ n7 S! nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- `% X1 A* k# g7 o; }4 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
; }. w4 F7 D. TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
G: n% z. w9 f' r3 x* }Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:5 V3 A: V2 ~* W' Y' U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:6 l6 c) a+ l$ j4 p6 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
% a B4 _$ k( r; u! w6 x! [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:+ f5 P/ {: T- p9 U0 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
6 u- V, B- M' L8 m- uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:( c- W0 I# C0 x! L, ^) n/ f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:% w/ _ I% ^$ D' O( G6 m& N5 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:9 i, q5 A! O9 e: ?$ A" g4 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
5 R( x9 v2 H0 X) {& s' NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
7 z" k9 Q8 [; bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
8 R% v9 M% U2 L$ FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
7 l' ^* w4 r/ l' CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:. A, c- v7 m/ f6 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
- z9 A" C+ i& ^% r# @6 T+ YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
3 J9 E+ A% h8 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:* D3 m! o0 R, A$ d# i, ^8 @5 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
+ N) E# n% [- d5 n+ KSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:6 e; D! U q( ?$ @$ y" j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:4 {" z3 b4 V. S( M% _0 h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:) a; s) W- ]" R7 c1 h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
/ r/ z- ]1 g7 @$ pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
5 N, b9 q' c, W. ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:/ J. [; c/ h' m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* C; I8 H+ N2 z2 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:8 F) I2 _6 z3 ?: Q* M
Finished searching libraries
Q3 n0 B# c: \. r8 F6 [Searching libraries
8 D% }& ]2 Z6 ~3 W% n: OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
6 _3 t# Y& q. P( ySearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:+ w Y5 {- b3 c: q4 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:5 a, b8 X: J( e. v4 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
2 k: x# f. A! b, ~7 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
& a7 ~+ P0 P; `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:1 n4 k4 A" @# {3 B; {! J" A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
5 F; e3 H/ F6 d8 l) ], oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:9 c* u6 C) B2 v$ b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
. H+ j! W" b" f" g' s3 k% g+ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: o* G0 G( q$ B: _/ @' c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:5 W/ p* X z) p$ b: F# e* P7 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:, l/ @7 j( E n! l3 O. o5 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:& I! Y! N' H {8 ?" p9 _" J" V. G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
, { A6 D8 ]0 A8 Q5 q; bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
( S* J4 V4 C& y, Y- Y6 v( LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:8 p: i7 d* Q& \8 p0 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:( Y \- T0 S* M8 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:3 s+ Z9 o+ C) N. I; Y F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
. E+ \1 K; X2 e; I/ }1 w" R- TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
0 A- y3 ^* K5 P! b. F) V4 |6 `" w K$ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
& z* P$ r7 j6 d7 v1 U& h$ fSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
. _5 W5 f) [/ D- n3 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 o q8 K2 [9 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:. v/ [! K9 Q! U6 e" `0 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:" v C2 a( l7 r& w) e) L( H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:$ S' l1 T+ A/ U7 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
1 b4 M) {( I# V. Y) ]: |1 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:) R' C6 m3 f! `0 j1 k9 x8 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
; P. n' \ o( x$ t( F3 \( K _0 H eFinished searching libraries
7 r5 H3 X4 p; J( w$ B.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found$ H; b$ l7 g) ~+ @& J/ ]" B
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
. I- E& o! T+ T7 F/ H" e6 vPerfMonDemo - 2 error(s), 0 warning(s)
, K# w) F# _' o. b% A" y$ U. q- ^========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========9 ?7 {5 y. J3 b: ]+ n: G
0 w( R Z; m& e" ]) X% L2 j
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
9 g F+ k* t5 a# ?" ^2 V解决方法如下:
9 p+ v9 {8 s1 ]5 k5 B& T1 GProject->Property->configuration Properties->Linker->Input->Additional Dependencies
7 g; R# u9 E5 g3 v6 R: Y加入/ h! n4 e" {7 N H' r& R
nafxcw.lib
% B! Q, @% L! X; zlibcpmt.lib
( p" {5 E H4 U+ }& B: W: ZProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
$ N# M$ N: A+ b. B4 g+ _) N- `" U加入
: t; V/ i- X0 K9 I: i' ]1 q' ]1 Bnafxcw.lib0 w- E( W3 Y5 Z* B( \5 B6 m
libcpmt.lib
( d( i& h! H! k" s) e- C# N4 E8 e% N4 e6 q8 T9 t6 Y) R
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:" |3 `2 s" H) o- T3 E) P
1 M6 ^. Y, y" @; O; d& w
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ' n6 X+ n8 l* R4 ~0 S
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ) S. j+ s/ q( g! m9 @ U
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " m p* f8 B9 z; l2 r
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
- s4 O J' Q# X! A. k调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib % J9 y5 m% t7 ?% i `/ A' N
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|