|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
) j V6 Z% b4 Z& j8 y3 F 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
0 m1 X6 r! Q( g$ @8 r9 x Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:1 n. s& p J; \- C
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library' K; q" }, o C$ a/ X9 {
% X4 J/ @. ?. p% A
修改成Multi-threaded (/MT)
, `0 t) v5 i) f! a' V6 u
$ S3 C; l, p3 E8 l5 K修改了Runtime类型以后
% R% d: N! Z: l) Z+ l& a' h' Q, e. G. Q6 t
需要将MFC的编译类型也改成静态库:
0 y4 T$ F& H: n& ], WProject-> roperty->configuration Properties->General->Use of MFC
+ b# v0 c' H, i* f3 C修改成Use MFC in a Static Library
8 a/ F* h9 J3 g+ _$ i8 M+ ~$ q h" j: Q+ Q' @2 o
一部分情况下在这步就能解决问题2 x) G0 O, o7 {: i* @& Z( J% l! y
另外一部分情况会遇见如下情况; u# E7 O- n7 d
# I* z+ g0 T0 y/ f. g& U编译器报错:* ]0 ` R" W3 n- a3 { X9 l
. M) a# I- \' q6 UCODE:
& ^' [8 E# d; |7 N$ Z' ?0 c; wnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)& d$ Y* I& Z4 p) Z* F4 K
1 h9 i C/ ` i+ Z. X y$ c7 m3 k
产生这个问题的原因是库依赖关系:+ F- [' Q+ `+ D2 C
在Project-> roperty->configuration Properties->Linker->Command Line
3 H" A* j' [2 u" _加入编译开关/verbose:lib可以显示详细的库链接顺序+ A% J& Q3 H* f* Z3 W" M
' a! D" U) g! YCODE:
" f2 u2 a' o2 E" S7 y+ J' q% M! Z9 Z! d
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
8 Y1 o9 n0 s7 J2 {4 F) _) RLinking...! t7 {& A% n% l3 E/ l0 w( d* j# p
Searching libraries
, A, o0 S' M" `+ i+ o; f! qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
4 l I' g* q' |3 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
3 p0 G: [, B3 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: M# D6 U3 H1 i4 E% K. }Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:; z' m* D/ y2 W/ F6 ~
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)9 p# ^# Q. S$ B7 x. C$ \" b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
4 d {% l3 J- M0 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
C$ k! H4 [5 r7 [: r2 S9 s5 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
: u2 B" _6 O) ?5 Q& X1 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:- f$ n" w$ T5 k) ?* S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
9 {( ~" {6 t: o) e5 q. kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:( E+ f5 h6 U J2 {* z r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:6 c; G3 c4 r8 R7 C; X" T9 `2 z" \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
+ |) F# n5 V& e7 s; t: d# ^! ^. v5 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:$ A. A* O( e1 l! g, _, `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
+ e" @4 _, e2 c. B% O6 b" {' _1 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
+ r/ t) t/ q$ C$ G8 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- P. y, h I) d( q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
: G6 v: O- Z; N( g! ]; @- J6 O5 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:% _7 Q+ p y! W, u& a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:6 a! r) Z( k0 |) n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:- D r0 Y0 Z- b8 g: B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:" _+ \: `7 w* P) ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
- F5 r) R7 z( |! [9 ^# A A" LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:, S6 k+ S% a- o8 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:& B: j) a3 P9 u" K' a- Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:* Q4 Z4 i; W7 M( u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
# r; u2 m5 ?+ r; QSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:9 {2 p+ m8 S* l; @2 c2 `. O/ I, N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
' V" H7 D6 m) k, lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:4 J4 g5 U# |" ^/ ~9 M6 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:: d( M) o4 N, j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:9 j0 L3 ~- R s# X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
8 S, ^; C) N6 l9 }8 f# FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
$ I* k |- S! C% H- GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:7 g f- s$ i# N& e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:; X0 x- g b: c q0 v. b% e0 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:$ i; q8 F; w. r$ Z4 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
! Z! E0 G- N. F8 b# XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
0 g$ f' e3 d5 m& s, s! R3 A2 xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:$ U" _! O0 ?/ K2 d6 c3 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:( J n+ U( {/ W! k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
# m1 I5 v3 Y4 G: j5 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
" R# w: L+ X/ U+ [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
9 H) q5 p) j2 v+ f, e, Q" C0 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:: V9 Z5 Y/ L; k. U9 |- n4 E3 Q# n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:( N6 j/ X' u% s/ G% l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
, k% w& k3 q4 f5 a7 ?) G7 K4 {' uSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
/ o+ h& |. B0 T. v* M, \ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:# H/ J: X4 L$ K. F- p4 o4 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
' Z- ~' U. A1 v9 H' f7 }# fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
& A0 A) M+ q0 y L H$ f2 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib: O" X9 ^- {: C# _6 f! ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
- E$ x7 i5 J$ J/ L) a) t' aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
P- G* V g* ^7 }9 V, ]5 y3 xFinished searching libraries
; t: C. h; A, M- n RSearching libraries
+ O/ k h! x8 v w" ] tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
6 E3 H0 }: \7 O* Y. }3 q4 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
) n y( E: K. ~ t* N6 }" d; t* ]; KSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
) S+ H1 a) K0 `% {0 A r0 g+ R7 }6 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
4 H1 |4 j7 Z8 I H, y( vSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:1 o" Y* K% z( t9 f% D+ s* x, ^" [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:" w5 x/ Y) g8 Y" f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
" X' u- b {- R; m' l" R8 ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:3 ]' P( R t+ C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:5 E$ W& X$ S: ^ W+ t' S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: N& t3 k# ^, I4 D0 U2 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
! a0 R, _8 T; c/ c* dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:; y6 `) e! c0 W6 a6 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
) q8 D) q* B8 P; NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
, f2 p" j Z% D! w; rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
# q: p7 d1 \- ~% BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
8 A9 r9 m* Q: G9 i. K% FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
3 q+ r' H4 S+ V% jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
7 X# `3 V# C7 s* t" Y0 e1 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
/ q/ v" e7 k" @( n2 q& {% d$ LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:2 t) l6 T. i. J* U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
( S w8 x0 S2 A6 V5 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# U% Q2 x4 B8 g2 m; Y1 M" R( E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:# o5 @" G1 T& G3 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:" ?: D! X! ]% V( `- K6 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:+ P( v, }7 ~4 P3 z2 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' w" Q# e! ?7 |5 x {6 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
4 F! u1 V% y7 q8 |, B; BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: w$ A; p% T* \& I6 R+ l0 ~! fSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- j z; ~9 B9 {2 I& U
Finished searching libraries1 x. ~0 t& G8 l* N. {0 i+ s( a, r
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
1 \2 w, F V8 j) u7 |Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
1 z0 C4 w5 v# _PerfMonDemo - 2 error(s), 0 warning(s): Y: m @( Z3 m0 d0 M
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
7 W: ~2 v+ V; @
% E8 h3 g5 o. G2 ^: G9 I我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。5 E7 A3 @# s# K/ k. p
解决方法如下:
1 S1 r- [, G4 m/ x: e+ U5 D) PProject->Property->configuration Properties->Linker->Input->Additional Dependencies, w6 Z& k+ F% L
加入
5 m6 N z" |# i% G, S; xnafxcw.lib9 C K# z h! o4 |2 X1 s G. b
libcpmt.lib
5 W# J3 D/ l# g: n" G1 KProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
( V9 n1 d4 o% k3 |* S% F加入
; Y z& Z9 C6 h; g& Vnafxcw.lib% |, s: A5 p. O$ @
libcpmt.lib( p$ |) r3 p: S
" Y+ c) `3 |7 I# k8 N9 ~& z4 P
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:& L) j6 A9 {; I2 y9 ?' i
6 z2 U \/ u V2 z单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib $ a$ Z( N9 [% L7 c8 ~
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 0 c# T9 L: \/ ]7 h! J4 {
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" ^" ?9 P: U1 z: G6 N# K) c调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib : X$ P) D6 v$ D% z
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
9 U* s6 Y7 @7 ~( l0 ]" x# v使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|