|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:5 Y- Q# t; U! k
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。8 q4 e# [/ v( m u0 y: u1 H/ ^
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
: `* Y0 Q s2 N7 R/ LProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
0 k, A( K3 ?. J( c: g0 T" t. [4 Q( f" m
修改成Multi-threaded (/MT)
1 m( B: _+ x+ B& V" |& z5 @ c' P. c6 x, h4 J* P8 H% A+ z, k
修改了Runtime类型以后
# _% g. K6 `: m2 V, Z& G" |, h9 b; `
0 f3 g: G7 i. v( I& r需要将MFC的编译类型也改成静态库: c$ o5 m' Z/ L$ d$ O
Project-> roperty->configuration Properties->General->Use of MFC4 c$ T- Z+ k) H% N# t4 l! O
修改成Use MFC in a Static Library( q" i. N" \- Q, q
; q9 t% s. J7 h一部分情况下在这步就能解决问题0 k0 A* a4 l" a _ v
另外一部分情况会遇见如下情况: d) @9 S e3 z( W" N4 x! C: y
) ?; r3 x6 s$ }( `& L+ U, Q
编译器报错:
% _1 @7 e, f1 I& Z2 W
6 y/ f- z) A. r0 N3 C4 DCODE:
6 @; z' @" V1 \$ vnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
6 Q) z" l, Y: E# T" N/ e* w3 ~
1 R+ p0 ?5 X. J' ]- j产生这个问题的原因是库依赖关系:
* v+ [! @+ {3 M- {. b& e在Project-> roperty->configuration Properties->Linker->Command Line- |: r3 d! S* A" O5 k
加入编译开关/verbose:lib可以显示详细的库链接顺序: p6 _% K1 [3 u% R
4 Y, H6 K! n' M
CODE:
/ \/ e+ v# k2 z5 _' W# t+ }; ~$ J, X0 l
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
* T8 c7 F. ]* R. xLinking...7 L$ L# g! p8 r* V# K* t
Searching libraries8 c2 U9 f7 {4 u; X N' _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) z" Z0 D9 ~1 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:- y% N" v3 A/ e2 Q# _) u" Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 b0 S; H) Y( d2 I! Y+ I0 S$ j( {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:" L+ N* _% X" ?/ A5 V
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)( _% d% e) z2 F5 }+ e6 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
' M: X4 i. N7 A/ x5 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
7 ~- z' L) \8 _4 e6 c, v& YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:1 k1 r: {9 x+ _- y$ k% |- x# R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:: b# \: C( {' Q) k. p q/ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:, m( u" w2 O% ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:- u a( y+ Y. p/ g0 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:; T7 f r( k# W2 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:7 w4 C" r- t+ u8 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:" `, H4 y' e; F# }' m! ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:. M/ `% R5 S$ }8 \" s" ]- t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:) l1 D3 S) \; _/ H! h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:0 a# E. m, ^% f7 [5 [. {! D9 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:: D1 w" h l4 L, I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:* K& C$ W# y" v* H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 s6 s; n& q1 v" D" D2 J9 _" U# aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:* a( [7 V, p: m& Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
$ K- ?1 F5 i/ w; U7 p. a% qSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib: X/ i1 S r9 |; f9 x* z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
! c- o! ?7 D3 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
3 Z( s, G. S3 t8 N$ ~+ w5 D+ RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
% ]! d0 ^& j4 T4 @1 A" q- G8 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:+ l6 f$ k3 V4 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
' r) B# q& J% W, BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:% h: K9 s) W' P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' J- e9 I6 h! |5 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:, b% k6 u0 S; H& d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
. c1 x" h# q( B( e$ aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:4 m, ?2 e6 ?6 {& S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:: n# ?. l( j) I$ O: Q5 r8 H! F7 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:! o$ J7 p; e& v7 c' _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
3 n0 F5 r$ j( U6 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:/ \6 b: H/ Q" x* |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! S% C+ O2 n! E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:- m) w+ y$ r% p- M; z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:: v* J2 N7 V% M, [1 q1 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib: H/ c0 d* ?* Y' |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
8 [9 `4 w* p z% P% I RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:/ X. D8 k- t' Z2 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
$ L9 G2 T8 o1 v( `3 a$ TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:4 ~2 |: [' V a8 d1 s4 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:1 N' D" S& R: R& L1 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
+ C6 R+ `1 u9 o0 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
& T! j7 L4 A5 a! N0 ], n5 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:+ z& a) O& l$ Z( x( V1 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:( G/ r5 H( J2 E0 Q* t6 t$ e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
_+ p' ?" X- R2 h( w% ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:- g, K- e) v. j$ m0 L, e) I- o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:# `1 Q. j: n6 s) V, a1 k/ a$ G# `' N4 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:* m' _& d/ O2 }2 w2 b7 \# l% z# Q& g
Finished searching libraries- G$ D/ k0 h" V6 z/ q6 l. b$ s
Searching libraries( v: Z: L( `6 X4 o9 L* X/ c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:: K* G" x7 @& o* c2 K# L. [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
- n5 g/ Y# F& ?0 w4 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:* u8 N. E3 b) B6 d. R' q$ t' h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
u9 {0 i# P! {. C5 h: t6 ?. j8 z) r& [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:! l; d0 z: ]& \: y" k# T% Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:7 U+ y' U/ |8 b8 j5 f9 I7 B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:6 p8 D# a" Q4 y7 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:% x- q, t/ T5 k0 j, O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:1 c' B! h) {, ^0 \% h A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:( m# ~* P& `7 F" S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
4 \$ A% L+ q1 v! dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
1 w; l2 f2 q4 {6 ~6 Z8 Y. [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
, x1 L# H% o7 o JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:- [, n% ~# @! m0 a6 j' f& F- t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:! W# {( n3 f: ^/ S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
9 g, R1 l' b9 X: [* }& WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
) j9 H' G7 J( J& C$ h0 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: e6 w( l/ I0 P- T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
" Q" p4 ~* F5 Z9 R KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
3 Z5 U. c# p. p! [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
* L) k5 f) [6 S4 _/ o6 @: xSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
0 B. w$ K0 K, tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:( Z- d2 z+ z" k W( O( \, @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:+ Z% {5 k. u( c2 |# ?9 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
! p# x1 I+ f- u J; vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
7 S# \5 L2 W, p! ~3 J( YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:1 K( O7 O% i3 u5 F9 X; I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
7 G$ V1 U6 b# O$ _Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:/ H9 \8 z1 l: X7 `- i' t
Finished searching libraries. R1 J% i- ]" ]+ A1 s. a+ S
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found6 r/ |! `% B( ~6 U! |; u2 r
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm", m; a# k! b* `7 s
PerfMonDemo - 2 error(s), 0 warning(s): P8 Q, I! M- g# v1 }
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========; j# C- |6 k8 r) W
! o8 {9 G. f5 U1 y# T$ F' ]我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。 J3 t# h( d6 | ^* J$ F" T! l* Z$ X
解决方法如下:" s! W5 ?" S4 N Q
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
% Z' C* N/ N. R3 Y6 U' s) X4 \. B加入2 J, @0 s/ z- y" y2 ]
nafxcw.lib% B1 C4 D. q: C
libcpmt.lib/ l5 ~& D. \' e( x5 R* R/ {
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
( W j$ `) K: b/ A" \7 _* o1 h加入
0 t5 o1 B6 E( o2 x# lnafxcw.lib5 V+ @ Y) m& S' [% w4 }* }$ f
libcpmt.lib
4 @, B+ L2 q( V) B
$ n4 Y9 x# e1 N6 p, f- ^ 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:5 {0 s1 v# G+ g- h
H4 E5 J% P) U4 P单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" ~- k B$ h% ~- {+ p/ N多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
/ ?8 c$ l0 W- `$ N/ S: P" ^使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 3 T& ^% _. T4 G( W
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib * n) R# N9 Y/ U' d2 g ?
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib " L$ L# p, H; y; v
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|