|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
) g1 S6 S$ ]9 c( X: o 最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。' t% F& x) V/ p( T- P+ T! k: a
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
+ y) D7 z" @. ?5 [* n4 NProject-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
- R6 {' d1 X8 v5 I% R* Q% t9 w0 W1 n% r$ R7 p' v. s3 t3 R
修改成Multi-threaded (/MT)0 o/ k' v8 u2 w% q
4 _+ y% }$ A% l8 S. v, D
修改了Runtime类型以后
- e( ^' f1 M c
) g/ M" G, ^7 { L需要将MFC的编译类型也改成静态库:
: _+ S6 k' u! y3 B wProject-> roperty->configuration Properties->General->Use of MFC
3 T( s3 N5 S s修改成Use MFC in a Static Library
/ s4 ]& m K) H9 ?8 T
4 x, x$ Z( _+ L% K* d+ f- C一部分情况下在这步就能解决问题
5 Z& H% m3 _" @( r4 ?9 ]另外一部分情况会遇见如下情况
6 E M1 @$ i3 S+ O% m9 {8 U3 e, w7 S$ f6 r& L v R# r: z- O
编译器报错:
9 y' ~4 T a( c
) K5 e' L# Y; b) ~3 dCODE:& h( O/ b$ \) M5 W3 q: V% R
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)6 K4 {4 s# t2 n1 P) z
8 k+ j% P0 Z: H, o
产生这个问题的原因是库依赖关系:) G+ T/ c9 d( U; L i
在Project-> roperty->configuration Properties->Linker->Command Line8 l( c; r* r! x* f
加入编译开关/verbose:lib可以显示详细的库链接顺序
1 [5 _ `+ @) N! a( x
4 @. P* @6 c9 GCODE:, e2 l$ z4 h" n: m8 i+ S( |
! i( z" ~ u& U' P% J
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
% o' M' }0 g% ?4 _' ~) \1 xLinking...
I2 F' X7 \. @: h+ ?8 N$ QSearching libraries
* }7 f; c; ^, W6 f4 a9 N3 t3 }5 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' l4 T# f8 K! q+ r/ X3 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:$ M/ D. b9 I$ p/ b7 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
l. `0 }* j$ z; z- V- BSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:2 K8 H* f! `2 B! |
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
/ x5 n; M P# v3 j( v7 `3 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
( u; m. ?9 T) T/ Z, u" z- _- ~9 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
7 s5 ?, d$ p g# \/ `3 G5 y) HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:. E, a8 V' O% o* v- }3 Q+ Y% I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
% _7 ]; D6 W' M: S4 I+ G% n4 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
! p: D$ y! y6 c7 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
, z+ r9 t. J% f. ?0 e# U8 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 k# y2 C! W) \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:8 N# d p+ a$ d r! A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:2 {5 `$ y ~1 n5 c5 s7 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:* ^- N/ P4 c4 K4 Y W$ N( F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
0 G5 ]& [+ `2 m6 G. HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:& q& r- k/ C5 V9 t9 ?* j2 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
$ y5 v3 Z/ V3 h/ |, ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
7 ?; t7 A% |+ z3 u' zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:1 o1 E h& M' ]8 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
; R( P R1 }, w ]* m/ v$ M" HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
$ l4 h+ k1 K1 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
4 L& v! W# z/ ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
2 M' ^. n2 l4 Q9 R4 @/ TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:, H' D' J! n/ o. t$ W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:0 M9 d5 o7 M, _& b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
3 U0 s1 W- ]5 ^! ySearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib: ^# ]0 O2 `2 V, P# m+ Z& j1 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:3 Q, x( {8 D q; |: R+ M1 n% _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:7 [! y9 |; n1 Z; w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
6 }) V8 m2 q# `* R' c. [% m3 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
* l2 j1 j1 \* W7 Z- k6 r" q! wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
7 W2 E8 b4 ] {2 J$ n- WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:& ?4 j9 A3 R6 x: `9 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
$ D) g' K" y/ `) s+ d7 w2 C+ }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:" X- g+ i" b) M8 m( z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
1 X3 Q8 O8 S+ N" G+ P9 S7 }4 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:* z" {. [3 J; K4 \# _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
1 E# j% x; D& D& N) d% m7 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
. A- H% v# y0 T9 ~$ [% P) PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
8 \! V2 z6 @3 V! LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:1 ~6 U8 ^5 C1 w8 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:$ P2 p- G( d) Y- j9 X% Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
- D$ I# V1 i% SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
, S. u# a2 l- B1 x! tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:' k# c/ C9 `! e1 W5 U* t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:$ b: ~" [4 R' q) h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
9 V5 d$ Q& _! E# { LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
7 o& c( q/ D4 b) G; r: xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
4 ~) g2 P$ | XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
7 O+ t$ M" K2 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
* f* Z6 {9 y% h! X# P1 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:, L4 D* X/ q! O6 z* b. o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
' G6 y- Q, H& H/ g* YFinished searching libraries
m+ J4 z) x: @Searching libraries
8 P: {: N, I. u: Y$ K& }. FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; k3 e" z' q* wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: @% O; L- T0 S; M8 t$ R L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:- r" j, r8 R& L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' q* O- \5 [% `) ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
' ^# o7 g* c: E0 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
5 L* \( g& z0 _: t, cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:" Q9 t5 [0 y+ E. x: a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib: M9 }3 I9 z7 E) W( b. ^4 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
9 R( {( m2 N( U" R- @) f$ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:9 G( ^& U5 Q$ Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
% k5 M, y; A# B/ G7 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:. X, s7 K0 G- c0 S/ Q3 i+ |% Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
! v2 Y7 H" {5 g- d" ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:, N8 S9 h0 a1 G2 K8 v! y1 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:3 i0 W$ a! a* h. \9 R' M' X! A, C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:) K( f7 G8 q0 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
5 R1 C$ s9 k6 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:* _. _! j- w7 r+ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:2 O" [) j+ U* v/ |; p+ H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:) g6 `; ^! Y {6 D6 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:% n8 q: D$ \' v- c3 ?' m* p/ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:8 n" A! V9 [5 A* ?" A! g" g# @; J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
" t4 n0 c6 M" v0 o$ r4 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
% Y4 y+ F- n- Q- ^7 M/ j$ OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:" Z" m& z8 z1 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
, E+ O' j2 J U% P; J7 W: ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
7 Y9 K8 d1 y, a# \ ]0 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
" w7 S: B b& |& s3 F$ f: u' d- T# C ESearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:' O9 Z- h) d) L& E9 K
Finished searching libraries
+ O" A9 U# K' J! A.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
+ S9 o/ ^1 C" B8 [# F/ [Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm") j: S0 u9 j: s9 l# c! G
PerfMonDemo - 2 error(s), 0 warning(s)% _, p0 h7 t! G1 z% z
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========# C8 C) @* H. P, S2 k, B; k* P5 y3 ?
& I t2 i: f( _+ X- p8 s我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。9 o& ]% Q1 n4 e) X& I. N& ?+ S* O' t
解决方法如下:0 q5 F! l4 {; r$ b7 i& n3 _4 G
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
i! s6 ?# l5 M# X加入/ }. l1 L% h5 X* H
nafxcw.lib2 O& f1 f @/ j
libcpmt.lib$ r; G1 e) o. ]
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library! l- o3 m1 A: r
加入
% a' J! Q# U- {; [: Gnafxcw.lib2 w/ V" i; t# u" t, |( [
libcpmt.lib' n" f/ @9 v, O; Z& D0 n2 H9 ?
& y9 W2 n4 m/ Y: Q
这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
9 J( t1 a& F. B( D# R0 R# J* d2 `6 K D( H V4 t9 n9 c
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 @- P% X" B8 ~9 c
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib . ]) ?2 S8 n' V- |0 a1 {) Q
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib * m: W) [( K, M3 Q3 `3 Q0 M+ B5 K
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 2 `& `8 `+ p6 ], X. @
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib + q( p& o) Z$ |3 z/ I2 @
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|