|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
% P4 b; I9 T9 n# @ 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。! D! c) e$ E& O) D. o
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:- |3 C# G5 S6 |5 u6 J {$ I
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library5 ~ t; d# w, a: Q. m
6 r) M4 P$ `. z+ |5 p r
修改成Multi-threaded (/MT)
+ Q2 T4 m" r! n" |
- e. u4 f5 W' b' v修改了Runtime类型以后8 j; N( R+ F5 A$ e$ J% ^" y9 F
: F' x1 d6 X. A
需要将MFC的编译类型也改成静态库:
& C( t( t1 j- b2 r9 ?Project-> roperty->configuration Properties->General->Use of MFC( E( X+ ]( d9 m; z$ b! c
修改成Use MFC in a Static Library h8 z+ g( w% s! D- L) b/ L/ {
$ e$ J9 ^4 S9 o" L一部分情况下在这步就能解决问题6 T2 s* ?4 n2 ~& I7 A1 |7 H9 {
另外一部分情况会遇见如下情况
2 f4 _$ F/ ~6 w8 G6 r4 C* e7 o; [/ V2 p7 z
编译器报错:% i/ M' b$ S5 T
6 a# X- C2 D) q, T" |: gCODE:. Z, U* s" k" M/ O' L, |8 D
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
7 a$ @; H1 j+ A: r# \5 W; K* Z( Q$ g+ p$ D6 }; k6 Z
产生这个问题的原因是库依赖关系:5 Z& T" X8 k; N. Z6 U( q8 F' f* B$ ~( u
在Project-> roperty->configuration Properties->Linker->Command Line
8 k$ p$ N% w5 a$ r2 S9 S7 D加入编译开关/verbose:lib可以显示详细的库链接顺序
. C' ^2 s$ L0 E" ]6 `# V6 Z* Z% g7 V, \+ I6 l+ f
CODE:" T- O- A# H* y- a7 O
6 m- p: _$ z* K p
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
0 h8 R" z, D" m$ d- z8 C& q9 iLinking...& w( i" ]& i# S0 c5 i. z g4 Q
Searching libraries/ D; `9 I5 X0 \3 e( G3 s6 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
( T3 D# I4 t- }' D1 F4 C5 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:3 J! {# ~. U; F. W) t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 ?8 s: E7 M! }! ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
Y1 x* m6 i+ T/ ynafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj). _! h6 x. B3 O3 o+ q7 d; C& }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( ?, S( M- x! i5 s7 g3 K$ p3 D% U7 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:3 |4 ?) @: I' g; y" D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:# p+ T' R' ?* O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
* e- K3 J( F- ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
4 P" z* _2 S1 B; D0 h+ ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
4 P1 g" l7 { s- M1 ^6 P2 W( YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:; v" {! {$ j- z) [- B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
4 `8 e" \7 C y: J6 _: r3 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:" H6 m) `! b8 ~' e& }* W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:( E& c7 I; y5 N9 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:; m2 o9 U$ H, c A5 a) P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:2 m9 V* ^) Y8 s. V! s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:6 r0 q* B5 i4 M' W( u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
' b) t0 v: t: S& h+ Z4 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:) i, V0 Y9 S- U w. g3 S( U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
) i9 |0 V9 o e: E& a" w% kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:( y% U9 Y( r/ g0 J. m, P% M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
9 B( m: p( z7 _5 l3 f" w nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:5 H% g+ t! J9 X3 {( T1 z% H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:! O1 r# F q! E# q. Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
. l# t+ x% P# U4 A! iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
9 c3 n2 h% [3 C4 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, N& ^8 ^' X# `! F' sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ }5 A: x. a2 {8 v6 u5 V3 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, E. u/ j8 Z) ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( o+ u8 C- K9 u/ S+ v, f5 a9 O8 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 `3 R6 s9 c/ Y" bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:4 D' Y5 s5 c; {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& w3 ], z5 r0 z5 x8 A$ M4 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:# a. u7 m" R, t& A0 k9 N' t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:$ V H0 W: L* {8 B- ?7 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
* F. n& n: L' Y) F1 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! ?% [5 o5 ^0 u& {9 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:" X# j7 T' F% m3 S; w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
7 X0 O4 X- B8 y) s8 Q: gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:7 l' _: E% x* n9 T t+ S" z- Q, D4 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
: t, }) j+ m9 x4 b$ V: eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
' e" F7 a8 h3 r/ jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:5 R" Q+ x- S5 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:( H9 N' ~/ W& F3 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:. E5 i+ {0 h/ J2 R2 ~: q% {4 w& a. J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
" m m6 r$ m2 U* e& o3 Q5 J$ sSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
+ ?0 b$ v8 X5 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:. T( q `- i% t4 F `+ t3 D, g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 \8 \7 I q& K0 j$ n& ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
& N7 ^, ?+ j" SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; F) `& g0 J: T. [' ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:. T; p+ z3 d+ A4 q( t5 p/ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:: D" o* T3 m- t& v4 L. Y
Finished searching libraries, [5 W" m% Z/ { x* `
Searching libraries% _4 s r) t* a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:3 F. t. W9 s- N/ t8 A- f7 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 I/ A# ?7 @8 n/ n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:1 X, Y z! |. f# m/ m" B- O$ w0 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:% n( B( a* X. ^" r7 u9 T: d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:# G# l! t' m8 ~, P; Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 S& F1 m! }0 ^3 [( ]% KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
" \/ u; C7 n, a. p Y0 X6 z: sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:: N J0 I1 q( m+ D9 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 u' W* x& t5 |( w6 H$ ?% CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:& c/ X% `' ]# x: m" b0 y4 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
8 }( U2 ^: h, G. @8 d' q }2 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:& {" j, w& O! k8 L1 F3 F) w' S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:6 o$ N1 [& Q9 i8 b. j* }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:" J( E. x! w3 J- d9 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
3 D6 T u/ A \9 b& jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
' E6 R1 `1 }) t) Q3 ]8 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:# V5 l, V1 S; A5 [, T/ F) I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
; W+ T: H( u3 J- P' x* F; cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 I6 N8 x3 x. g7 ?. H7 W6 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
S& M8 ~/ p0 D1 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:* _) @- ]9 s d1 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:) [( |, y/ M7 I/ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 q. c' P/ Q H5 m7 l5 s8 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:4 w! P* y9 ]/ u) z% k% |2 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:/ x! B9 @, D+ B" k! c; S8 ?& N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:) L6 m9 \+ N0 U, E+ j( z7 ~0 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
6 w4 U: u0 A* R7 @' J" _Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
4 k+ c) x8 e' CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' f6 d1 T% o+ A1 M7 v8 JFinished searching libraries3 p4 s+ t* R7 i) ~8 b' ?. B, W1 I4 O
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
7 N% d$ ^8 \& U4 g' mBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
, N3 ?8 s2 z5 x+ @4 N9 fPerfMonDemo - 2 error(s), 0 warning(s)
4 w/ I9 E" ~( D, T========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
) c) I5 c1 h/ ?" T( u/ R, M, x5 y: D" ?2 J* m Z5 x* T5 J! E
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。 a0 u6 V# I' r3 Y
解决方法如下:
2 U( o8 C. S5 j9 l# m0 N: f& r; RProject->Property->configuration Properties->Linker->Input->Additional Dependencies: K- J3 K: Z2 i: J/ P$ b
加入& N8 ^0 H5 c2 N
nafxcw.lib
; |/ e U4 T7 _% Dlibcpmt.lib$ D! m/ _$ V8 k
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
0 v2 z5 U. d$ S- `加入
% h, N. c! y9 B1 d$ D* Lnafxcw.lib
) u/ _2 o9 V. ~4 q* Wlibcpmt.lib
# C( f( e8 s2 J! ^
, G# F, ~6 v, j 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:# ^; y5 j2 @" b3 Z8 @! L$ R* ]4 U1 W
8 G# p. d( d! u7 H- a+ V2 W W
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " \5 p: c7 q2 a0 \( r* g
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 3 R" a* B9 v. D$ G8 w4 W4 o, P
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
3 I0 b# c; l- ]调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib : P8 m1 M; s5 T$ ^' K
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
( G* c7 {. Y+ [+ K' Y使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|