|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
# L! I5 r* }) Q8 P, W& a 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
0 u/ f* r+ I+ \3 l& ]5 q Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
% e. S1 {4 t9 ?5 i. VProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
" e) P* R7 E2 E! V7 Z9 X9 y6 o$ @1 Q" u% W" h
修改成Multi-threaded (/MT)
! N) v+ P1 v! j* c
% k) e2 O4 z7 V* B0 m9 p修改了Runtime类型以后
) _. K5 J. @7 N7 n f6 N+ k# V3 D1 ~) R6 C8 n* z
需要将MFC的编译类型也改成静态库:! T4 G& ? ^+ X! w- _) d" ~
Project-> roperty->configuration Properties->General->Use of MFC; p9 f! Z# b+ I9 o, q
修改成Use MFC in a Static Library
4 }& g* [& A* }) T1 ^, d$ [3 Q. N4 L
4 L' l: T$ v6 I! |7 \' q- p0 Z9 j2 p一部分情况下在这步就能解决问题
& Q& y. w# y/ w( l2 \* C另外一部分情况会遇见如下情况' e' f! u( i4 U% s w% A1 }
4 ~. u" u6 k; z: z, r
编译器报错:" S; K1 i+ A# q) X* {0 O0 U
! n5 c# I K. |% d2 S# z8 G# n2 p
CODE:5 k( S1 X% Q1 \1 Z2 w: ?
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj): \9 n; M& c2 @# p
2 P0 r8 l% h0 W6 c T( N/ I* |
产生这个问题的原因是库依赖关系:
; `' b+ d3 i5 Q2 t在Project-> roperty->configuration Properties->Linker->Command Line# m% y( U% o. m, v* w: L" r
加入编译开关/verbose:lib可以显示详细的库链接顺序
& W2 Q' u" S3 K, e- o
9 Y% e. q, X. _# |; M# xCODE:
: W1 Z/ p: D; \9 x5 W( Q6 y% j4 L/ e" M
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------" z% h0 J8 P! p* m* S) p
Linking...
2 r. {" I' w) k3 W- TSearching libraries
( `" Y$ K2 w, D# kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
4 C+ `& M! {( N+ o* ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
& g* G% V# q+ T# h2 O+ MSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:% @6 m: R W9 ^( ~' E% L5 i6 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:/ s: h. b2 U X- D0 V0 w. o3 ^
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)5 A3 N2 x* F6 w* [$ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:8 l, K- I( @) P; C) R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
: B; r! u% q! M9 c8 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:; A6 J" x3 T- b; P' l, f( Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:. h- T" v8 ?; {! |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 o# y% W6 D( o4 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
6 a0 T; k# a+ ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
* b5 ^" b' o8 f% T9 L( x' BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:; r& j6 ?! C( M9 D% S6 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
, b) r3 ~9 @ C% z% U9 Q. S1 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:' L' I) K5 e& @6 A5 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:& w0 R+ G+ Y: w1 Z, N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
5 e% u! H" o3 b4 j, tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:9 t w) U; i$ }7 F; ~! `4 L- O; k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
! M' B# d" y+ M( p5 ?# t2 M+ ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
" @( r( e" e5 f% n, l4 V+ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
! p3 z- ~. t8 J+ l; y; ySearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:& m+ Q$ j; n8 h* H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:' t6 d' k- t- I2 B7 q5 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:$ O1 s2 M; I, J- H! Q/ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
) i5 p/ A$ p2 W7 l4 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:# B" r8 C& t! n) O' x6 }7 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
5 d4 s7 M. S Z) N( c* [" m2 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:5 i) V5 m- K$ Z" X! ?- J6 H( d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:4 d; B, ~- b( `: [8 F" D' n. ~$ \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
- ?% M( N h9 g3 A, ^3 j9 W5 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:1 Z! d. G; h0 F1 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:+ u$ s. ~6 G; ^3 A" |% d$ K+ O- f0 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:7 V- s3 v! O. w1 |) U# `9 Y& P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
c% { C5 B( MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
r8 O& s( ]( Z) ~/ F2 ]8 p+ I1 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
- s: d! X0 A+ f; f0 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
# j- ~# N4 [" w0 s( _$ [' A" ]$ k# MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
! d5 c- X/ F5 b0 o( V1 l( E0 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 T9 Q3 Z8 A0 v2 |* { sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
& N( I* u9 u) B; Y5 |( u' F; e* k! BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
, ?; p( Q4 w1 A" s/ F* l/ K$ _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
; M3 A6 I2 F8 U L# ?1 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
4 d4 `, X" Z4 t* Y: VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
( O4 G& g% t7 l% v/ O2 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
8 I6 A P; T; z/ Z5 U" z& USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
0 r& N- t2 h+ _& lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:0 g3 ^5 v1 Y' l; a+ b3 e5 ]4 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
0 I9 c* q- S9 | W! G; l; ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
% @( h( Y# P# P5 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: X+ m' d* P$ t+ E+ v5 k( y/ o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:; H2 |' C4 c% }9 _$ C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 {2 T; E6 L5 ^% K8 Y; t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
1 e5 i$ b- m2 m0 P( DSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! J! m, D, z/ ?& B& K' I9 T) f9 U, aFinished searching libraries
* s @& a% p" p( j: NSearching libraries& @/ |" h: o6 n9 S1 M+ T6 V( {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) k. T% K. t5 B# z a+ sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
: x6 d. H3 U/ q5 I# _' g8 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ S% v5 F5 {% B6 K d! xSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
5 r7 n/ }: `' LSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
H' O3 G% B8 `0 c1 @& _! pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:/ ?9 M9 \% G6 U0 l/ k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:4 Y9 w5 N& _& K2 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:8 t% m: B: R* g7 z5 [* j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
) Y8 c6 G/ X2 @* m5 m% OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
, Q+ L1 R: _! _7 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:2 V1 X+ u0 [' G. E/ Z% @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:' C6 C) @$ l- ]- f% A. j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
( T8 p2 w; U( O5 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
" d, k" Z" d! r1 A2 b9 F/ y, S+ YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
! S: T9 E9 \/ N7 H5 S, a4 ?) \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:9 S9 A) i9 \8 W/ k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:; w7 k/ x V+ q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 G l6 d. X- ^# d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
5 C# B. ?7 A4 j9 r6 Y: kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:: J7 j- ^) V, o! Y% p# L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:8 P# @& }$ S, F/ M9 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
/ B$ D4 C, [& J& ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:, B0 @; v+ V; R3 V( _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:; q- g) I7 G7 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
8 _* S. V1 T0 b3 K# {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:$ k( h, J z1 d! r8 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, i4 b& a. Z( N2 e$ _6 k; B9 \) qSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
* }; u q; I4 Q& @# HSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, {- V' L/ r8 ^3 Y, f6 nFinished searching libraries" C3 n& X) t) m' a8 t& L
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
3 D% A r2 A+ G1 \8 h0 rBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
! c3 @$ b) f9 E3 @ {PerfMonDemo - 2 error(s), 0 warning(s)
! |" X& Q0 }' j+ e: J========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
7 D( Y4 i. U- Y, q
, N6 F: y5 V( f. p9 @我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。7 V8 Q; c( @/ C5 h+ X; v
解决方法如下:7 E9 k, k; T$ @/ Z
Project->Property->configuration Properties->Linker->Input->Additional Dependencies2 ]% m+ ~" ?* _- C4 ]9 S* s/ F
加入- w7 l/ P* e# F1 {) ?
nafxcw.lib+ U1 V; J# k" L' U
libcpmt.lib
( y: m4 D6 y) t% k5 X% IProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
: n+ z( i4 N% \* c& c" q8 A5 B6 Q加入! A) @/ U) T7 ]$ j/ `- D
nafxcw.lib' S6 p: R5 F3 z' T
libcpmt.lib
1 r2 Z# A# C; V, H/ ?; M' D
/ x/ s; _: n$ s$ b 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:2 X2 R4 d8 s" h; w7 g" n
/ E/ \) v2 q" Z, E8 f单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 2 y$ {6 p ~" {* w' v, h* z
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 2 {9 e. _9 G1 j, C3 Y. o0 i% w
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 ^) c, J- |& `; ^( j4 K) K* s
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 9 v& ^' U. T+ E
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
6 Q! X+ R. i& {5 \! f, q使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|