|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:0 h d3 j: s, F$ d
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
# e+ d7 p' w2 ]( T# Q8 C: \4 D: V Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:$ v! U+ D3 _7 c' u# u4 k
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library" t4 N" X) W( G' j! K% |2 y
2 |) T7 s/ n$ z
修改成Multi-threaded (/MT)4 h5 X; {9 a# i* R2 W& S
( m' g; V3 k+ Y$ S* s修改了Runtime类型以后
% }. ]$ M& o. |/ b% D" k' l% q! v! s0 _0 S
需要将MFC的编译类型也改成静态库:# m3 Y- B. m& C, x4 }# f6 a2 }3 ]
Project-> roperty->configuration Properties->General->Use of MFC
$ B [, h- r. u修改成Use MFC in a Static Library
5 I# t2 t, x, U" ]& [8 Q* I
2 t9 {% {. W0 `( K一部分情况下在这步就能解决问题 k5 L+ ]( d3 w9 g& q
另外一部分情况会遇见如下情况0 l M) G1 T- ~. @
# F4 e6 M7 [* w* M
编译器报错:
1 @# X+ G" A s2 T4 i. b* z( U5 h4 d& v
CODE:
7 p; d9 ^0 M& c' n+ B% mnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
# _( ^4 ? s& A/ s2 t! x+ N2 G( K
产生这个问题的原因是库依赖关系:8 n4 g; ?. G/ X* U/ q
在Project-> roperty->configuration Properties->Linker->Command Line. V+ U: {' N. R, R8 J
加入编译开关/verbose:lib可以显示详细的库链接顺序/ W: U5 G3 A% ?! P, ^
. P. b$ ]1 W5 F$ c, `
CODE:# y$ s$ G, k6 x; P
' ^7 c6 v8 w- X0 r2 o
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
3 H( h2 M! l* G# O( j" s/ n. s/ xLinking...
9 d$ D# z" j$ k- M, iSearching libraries, ?* E3 |4 q& P. A3 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 u2 u& {; Y. G& s; w( q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( Q1 r( M: Z @: K8 N8 d0 z" a2 ?% O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
6 K/ s; A! C7 b1 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, d4 R0 [/ ]1 k1 Wnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)3 N2 G l3 k4 q5 v( o3 e4 ?. V9 y% g) j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
3 l7 T* h6 M# b7 q v9 ^9 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
$ |! Q' d& d5 j& ]! J/ rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
% L7 L/ j& C; ^/ u, xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
. d6 ~& m( w& Q( PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:# P/ }: d1 A/ t) ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
4 D$ Z! d5 R: g4 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
$ Z0 Z" C. [* V9 s! bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:: ]+ X$ Z: r- _6 F( m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:: f8 S# Y; @ G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:3 v% B: u% A1 V4 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
9 [/ ^) R* X, y; A5 T% c7 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:" l2 d2 i. w! f3 [% N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
- Z' v# j* ]3 B+ o- OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:" x- k$ u* ^+ E' }7 Y6 h, k7 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:( k+ {: k) e9 Q% \; q! u8 O& W. L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
+ o3 v# N* j; x/ L4 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:4 J" j. p2 q. }2 I4 Z7 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
7 g) G; W/ Y; A! J% @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
5 B+ P# K' M& v% X# cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
0 {$ c$ y7 A* c" U% k, ? w# ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:. c# {: C4 _# U1 d* i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
2 P' D6 n% y; A7 y2 Q& q9 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:/ p' J9 V; a- \( w7 X) v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:/ g. A" Y) i8 V3 g( i l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
; l3 ~, J5 a) S3 c0 n g+ VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
* j2 [: m% ~) X, jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
$ L3 {6 k; } ]6 k* h- W! aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
# k2 k# _/ h8 K" jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:/ T" O" W, D, V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
& t/ J; D4 X2 H1 ~( MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
2 o, H1 e1 P1 _6 l# {- HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:% ~" ?( m5 |" @1 A& G/ s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:0 i" D) {3 z4 k# g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
! a1 @. U: g" D5 d- y3 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:' j1 s/ f2 h+ T8 d* m3 w+ y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
# K, Z- c8 B( C4 ?& FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
, y; e% ^7 o* I0 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:" z, X! t8 W; r9 |. N2 z6 T" g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
+ r+ }! Z$ V. [0 v8 Y8 j7 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
$ a9 v" ~" L, dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:2 W) n* f' p0 }6 h- k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
9 N1 V* u$ p: e0 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:- F6 L; R) Y6 r1 L% F1 _6 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:2 p+ j' c& z; v) l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
2 p9 G4 ^1 `4 Z h- V* aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:$ m& o8 `2 C1 c! H5 b- d2 ~. W9 v: A7 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; J% i( F( W: Z) f7 Q9 Y3 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:! E% F# T4 _" W+ |" O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! k( o/ s/ [9 PFinished searching libraries
, j& R! P4 P2 M; ^$ _7 n" [Searching libraries1 ?" N- F4 S# N6 N3 U- Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. r* x& h% p5 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
& B; X6 n) n0 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( i2 o& H& Y, `7 @7 M& OSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 d8 k1 d$ E9 w! B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( K- R" D6 T+ `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:0 | t6 S+ t* E1 L" t+ X# h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:/ t& `: F8 V# ~6 }5 Z! ^& v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:7 M# ?; W) o- r2 v3 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
$ Q7 V; Q2 o+ G5 U/ ]! r2 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
# V4 g1 y$ [9 [7 L8 m: aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
$ h ?. z- k" ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
' R" M* x$ ?1 S+ f- {* vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
. b/ ?3 B$ N- b/ HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
& \, b4 M# i) pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:9 C2 M% Z. T( y4 `3 W7 ?0 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- x( f; z8 x1 r, P& I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* J- E& w) K' r' }- I$ N& t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
1 |$ A1 [: A: N' Z4 ]0 c# o, J; uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
; |% ^7 \" w8 B0 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
* T- P% W7 S% K& D" GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
0 c% {/ \& A. q3 N! |Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:1 \. ~! X) K) J& j0 O8 o$ \5 _6 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
' ^; h% o9 v3 h1 _1 F3 k- z" oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: |+ o: s4 ^7 p0 U: _2 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:7 A. M* {2 N- ~, P4 }7 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
x) @& T4 R; O# F2 X ^1 ?! K& TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
% E: a6 V) v/ M; t$ i7 S( Q: A/ cSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:- a* g$ s: ^. w) H% B5 n8 o- U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:8 y! e0 [* ~- i* T& x
Finished searching libraries+ m- @9 L$ ?5 C
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
; b# m9 B8 v9 \, H9 BBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"& i W# ~2 ] @' Y
PerfMonDemo - 2 error(s), 0 warning(s)
( v1 T- k( y/ W/ P- b========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
4 [# |& N1 }5 O6 u
* ?5 o4 b& [/ n- [$ n我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。5 b+ Q+ f1 i3 g* ^4 W1 Q* f) R$ ~! v
解决方法如下:
: S' ?9 X A. q& a; d5 q1 @9 I; L$ GProject->Property->configuration Properties->Linker->Input->Additional Dependencies
' W P) r/ m& c" n加入
5 j3 f' l8 q) s# [nafxcw.lib
! u' P M+ E4 h Zlibcpmt.lib
& O' J ]9 K& T0 ZProject->Property->configuration Properties->Linker->Input->Ignore Specific Library8 T/ j7 f& p9 M9 n+ ~" o
加入
, l+ |9 o- @! S+ M4 lnafxcw.lib
% W4 j5 G4 w' m8 Ilibcpmt.lib) o: r+ E. Q( M) W0 P, o$ X
8 y' R) w$ h( S7 s, Y 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:* Z5 J# U. N5 A
7 ^; b8 }) W& i8 v* _
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
O3 r4 t/ ]; R多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ! F, R3 |, {9 S
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
- ]6 ?. K7 I% G! h/ u$ @调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
& ?# E- f+ Z8 v# S4 o调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 3 ~) m* {6 E! R$ n' S
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|