|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:! b- \" S) W4 _6 L
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。3 R+ t2 S% v- [ H& o
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
8 L4 Z+ Y4 ^+ X, l9 P7 N, JProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library$ v/ J% l4 Q5 z+ t% q4 t
% g, Y: ^+ N+ c1 o
修改成Multi-threaded (/MT)
/ _% {+ g, d% f" { ?# f' C9 ]
4 ^) G$ E* y+ f. w$ ~* I' `修改了Runtime类型以后/ [0 T4 }' N d& R+ ]
5 }6 z, m+ v- A |# w需要将MFC的编译类型也改成静态库:/ ]- r( x6 c$ ^- A! f
Project-> roperty->configuration Properties->General->Use of MFC
6 C0 ~/ b+ m6 K/ f) G修改成Use MFC in a Static Library$ c) G% z% U6 {& K3 _
7 ]5 }# L( j- t! U一部分情况下在这步就能解决问题
4 e6 t4 |6 R3 n, y3 C另外一部分情况会遇见如下情况
0 \4 O+ ?. x( G( A8 P% ?6 [& r! \
- P% m" v8 K) P' b编译器报错:& W8 [0 E8 Y( @- {1 L; b& J9 g0 K
$ Q" I9 C4 l# C/ ^" X9 M2 d
CODE:
$ K* `9 {; t7 Y! Bnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)& y. C! I3 ^! s+ ?: v
7 N$ d$ |7 L; @0 c" R产生这个问题的原因是库依赖关系:" M; B/ ]& e4 u( Y- O# \
在Project-> roperty->configuration Properties->Linker->Command Line! _$ x$ U+ w, i% |. G
加入编译开关/verbose:lib可以显示详细的库链接顺序
' {/ ]% `4 ?7 J8 x1 z7 D8 N* K: W
, u. u, E4 ^2 W2 \1 T$ A! T# R" QCODE:, J$ X( B8 Z: {0 q! {
( K. M0 S& ^0 ?+ x! m ]------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------ v' F8 W0 N6 s, q5 U: d; `
Linking...
" V. m* p) Y+ I: R5 \! e2 KSearching libraries( ?. t0 ?7 [4 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
7 u- d" }# ~; f" A2 u" _ f$ lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
" \ a) o3 q/ J# o" S9 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
, o6 i( J1 V+ B3 P3 _2 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' W! B6 n: e8 |2 Inafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)1 r2 F# p9 ^9 N+ ^" _5 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:3 a1 f' Y7 S% c8 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
; J& u& y: G& Y5 f, lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:* M* y9 u3 E1 B7 C9 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
$ f b+ g2 e$ hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:% }# v+ ?* u3 R0 K$ p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
) Z3 E3 w% K) d6 Q Z2 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:$ X2 e* z& x3 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
% C( C8 w% U+ x* D+ B3 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
7 R R" Y9 Q1 v& e9 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
! a- q4 }6 n# u, |, w4 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:6 ?1 ~1 c0 P o# y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
3 e2 L7 W' v8 V, |: N v, V7 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:( g+ G5 |, X* V/ G6 G& y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
9 G3 N/ `' h& |" dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:! q0 k0 c) l: V8 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:& T" u- d. t) d9 L( R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
: q* [8 {( b$ ~* n8 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:* q$ F6 s4 O! ]5 f; N9 B8 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
& V1 w0 V) s9 @: j$ o( L$ BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:0 w$ j5 m" j' h0 k# ?' T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
; v7 n& B+ ~$ _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
% ]5 n/ n! p$ ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% X1 ^9 U0 A" I; H4 V9 H6 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:1 E! |) T0 z# I8 o7 o( x. [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
& x- T% G( c# k$ h/ i/ C5 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
0 H, W9 | P& ?/ a2 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
& ]/ M x9 F" Y# P+ rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
8 J: w6 M: J' d u2 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
[ B( ~: h& n" ~" FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
: T7 K; N* k2 C2 p3 U3 e0 x5 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
9 W8 n9 p4 U9 a) U& K+ PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:% I9 z8 x% C0 n' ]8 ]3 Z& ^3 `, b/ z% j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
5 m% |3 K; Z- O, KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
5 `* ] V3 ?' K1 y; hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
0 F4 }5 ^: V7 J- v9 h9 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:: K) ~ o; M5 c; p n4 A q5 B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
. c) s: O& u! d2 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:6 F8 M5 E) t( ~* {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:6 @: k% d1 ]6 \) ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib: P) J$ i# T; p6 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
% j: m k. k5 l0 v2 s0 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
! g4 q6 e: q5 X6 m5 M* D- aSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:& t# Z# ?# Q9 s# \0 _8 k! k* C8 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:, {- l c# g: @! C/ a$ D0 h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
% c/ |4 v6 v. m* @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:. `% N8 t( h& B- ~2 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:* J; P$ _" v7 [6 J, z! B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
. R( P0 C* [" }0 W1 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:, \+ h) e4 @6 E! q+ J
Finished searching libraries
: r% b' V/ N! t0 USearching libraries* ~* i/ R4 b- `, I3 j! ]: O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
" Z4 m9 c6 V" K/ }: Y8 y, x& xSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:7 ]' { f5 R' K. E' ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
" a* v8 S4 p4 M5 W7 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
6 E( z5 x" Q3 ] w6 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:* U& a }* f7 Z, O, x2 d& B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:7 U2 b7 I! Y- i" \* t0 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:. c# h" A8 {% `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:+ j+ q, L- r( {+ r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
2 N6 t3 n* Z( }6 F* F' o% RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
$ \8 O {, d; C1 x4 E! \5 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 p7 L6 t5 D: H; |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
' T$ v6 }5 x. |1 Z$ W- W, JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:/ Q7 j# K0 C0 e) n, w, I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:) J1 d, }, W8 S( C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
- a t, I) x' D3 _( u% OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
2 x6 p& ?& F1 D$ N0 u! q, g; o& USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:, \1 }) S8 O( i" H1 F4 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
( E/ t0 S( S7 G3 k: XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
% l V0 Z/ |8 H. ?, r7 D' \* a9 `6 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:3 m+ c( J5 {; ~% \5 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
, [- j) c% d+ G6 | |. M4 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
}5 F% ^( f6 s6 A' e- iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
* N9 X: [+ A5 p3 O7 Y8 O; ^3 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 T( _- k" ^$ Q6 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
, W) x, M7 x# p/ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 j, t3 s v0 C, O3 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
( ^/ c" w4 w% P$ C0 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 b6 e. v4 {& P4 f2 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:3 U# W" {+ m" J+ v; J8 B$ R9 B
Finished searching libraries
+ c1 f- v" J8 ]7 t) h. k# K8 @: t3 B.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found+ P6 H' g w5 G9 p$ t
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"7 W# g7 g) _$ \. g3 k- m1 ^3 j
PerfMonDemo - 2 error(s), 0 warning(s)& z: e. `8 c0 W
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========( a( g% ~( n+ V ?
8 S" h5 q6 }. d+ U, G: o; P" K' |我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。, K. X3 Y5 u$ T' \: p% L
解决方法如下:
8 j* [( a/ ?- a( ~Project->Property->configuration Properties->Linker->Input->Additional Dependencies( v' x# U; F( r, z9 Z
加入/ q# X# X" ]/ `
nafxcw.lib
6 @+ z7 r" ^% ?$ R- flibcpmt.lib
K' A( |8 e0 e( D& K2 V2 @Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
, i7 l Z; z6 L1 R# I& r/ ]加入; h+ B. p) D9 F. { g
nafxcw.lib2 M; |" R1 u3 m& {9 I
libcpmt.lib( Z; H# o0 ~7 z" s9 b8 C
: V) ^+ Q, A9 r6 s O- Y0 T
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:" G, H7 P3 r7 V' K" {* h" h3 n! F
$ W% m! u# d: {
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ( P! W, n8 P% ~- o
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
8 x0 ~, O# r& r! o使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
1 r- @* ^5 i/ y6 Y调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
- D" I2 A0 c) A% `3 [调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib & S: \2 j9 {) L- q$ H
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|