|
|
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:9 L* I3 E" T+ b. c) z
最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
% C1 m) F: ~5 u8 @, o0 e _( D Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:' G# h+ k( g3 u2 N( {8 A$ p
Project-> roperty->configuration Properties->C/C++->Code Generation->Runtime Library
$ s% P8 F! S1 ^0 U; n1 E, |, b, h- D# B* {! |$ f
修改成Multi-threaded (/MT) S2 r' W9 D+ G
2 E: u+ \- {( ]3 n# ?* ]修改了Runtime类型以后
- I. h7 G C4 B7 T7 [( V" \3 u, M0 h% m# B4 d
需要将MFC的编译类型也改成静态库:+ @: ~: U+ q1 ^$ X; ^
Project-> roperty->configuration Properties->General->Use of MFC! }/ d5 X& K: U6 U
修改成Use MFC in a Static Library
. h6 T3 t! i9 O% p) {4 v4 F6 a0 n. ^: Y' v
一部分情况下在这步就能解决问题4 i: Z h; @2 F! y% t% e& }( S
另外一部分情况会遇见如下情况" k- z2 a/ E$ f3 K, {) i5 K6 D
, ]3 R O% w- ~0 o6 t编译器报错:
+ F+ `8 Q0 V1 n- ?1 s" E& x/ F$ _. w: b# M+ I6 S' D
CODE:+ ^4 h0 `0 w- |+ b
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)5 }8 B' }) A1 |: J" t% f
# M, z* G4 @( y6 { k4 d4 ^& z
产生这个问题的原因是库依赖关系:" ?: @ ]2 @, f9 m# M, F, m6 e! q) _, o
在Project-> roperty->configuration Properties->Linker->Command Line+ C1 ^: t( W4 ]9 b3 s. ]8 s) n+ U
加入编译开关/verbose:lib可以显示详细的库链接顺序
5 ^* K# Z1 v' d7 a8 _' x$ |1 T/ o$ T8 a- G# e# G8 E- h
CODE:
& z9 z, P7 I3 l/ X. ^% \# t
# p F# b9 h R; Y------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
3 X1 U4 H V1 l- U: r$ _Linking... s$ t! W5 r' r7 n' e; h2 M2 X
Searching libraries
3 S1 V1 n5 Q- [; K5 [+ r% @3 n# `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) E o" L6 R, T" L5 B1 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
/ r1 D1 V/ }" C$ o3 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:. M; v( P7 A; K- H6 c+ q$ S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- h& { j5 i( w9 Z
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
5 S8 O/ a" C% k5 P# L4 g$ A" w: \& mSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
3 V' |* o/ a' @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:+ y! x/ r$ P6 t- s, C$ p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
" F4 H$ t' B) F% ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
1 ?( |) e' x5 Q0 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:1 {5 ], j7 i9 v: z# ^# F9 a) Y/ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:, O- d% k+ d- m- _$ h+ U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:/ ]$ }" A7 }' H2 B. ^" a9 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:9 }- Z) _8 e+ }8 q4 ?: I3 r8 e" |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:5 s, T1 o0 O& P/ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:3 W! i2 K I: @$ ~6 A- E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:% q" I7 a" e, Q# k7 \* s' ]& s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:! g% L' A2 p+ J" F" W M8 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:; Q* _* f n# ^, G' J- Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
0 e( [, Z6 q! y) H \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:4 ^$ K5 [ \* X8 Q# ?* B+ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:; E: [4 }# h0 l( x( S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:2 j' c1 r# a3 n! u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:& f: }& w& \& @1 B2 P. f7 o& _/ ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:% I6 P% p" D1 n$ I' {# @3 I3 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
/ q: P' h5 U0 k2 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
3 L2 g- w3 B2 [5 Q/ V3 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 c8 E5 |0 C; w) I) J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
& b8 ?5 ^- T# k5 A H& KSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:! g9 J* C8 B# d! g, S4 ^0 E+ @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
2 Q: K$ T: _+ F* o; d( y; @" y0 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:3 M& y# a+ Z/ k; ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
) Z1 n$ Z7 a3 A5 a j! k# {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:9 @5 ]4 h+ ^2 x' Q& ?7 m+ K0 O0 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
! ~" }* G( t# Q6 [' gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:8 @" J1 [, h7 q; \5 V: N, l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
; v7 h! I L! ?3 t7 F3 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
. _- P3 C: d5 E" OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:' f! X! X- h/ m$ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
+ h2 E/ d- d& T8 i: DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:7 s0 K+ _1 E* P K1 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:. ?. ]/ F- [! |5 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
/ V# [& I/ g2 @7 b& I8 |8 `3 J8 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
& x7 R2 R; [% V/ b% RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
/ e+ L3 d) X fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
2 v0 X4 m3 [) k( k9 F8 ]# y4 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:' C7 y1 Q. S9 }/ l% r* C. M2 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:+ Y4 p+ X' ~; H7 E2 ]( b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
# W1 v% D \7 B+ T6 L. Y0 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
7 [, b0 f/ ]5 @% i; nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
0 M+ P) ]9 B/ |& l$ D- \" ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
/ d7 z, B9 z6 q/ i# }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) W% F% ]0 O6 ~5 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
M+ A p, c4 s* N$ d9 f uSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:. n) Z( l+ w. q' c. P, i5 B
Finished searching libraries C/ {2 |2 V" @% y: H
Searching libraries, B! o% L$ V( Z. ]7 t4 l6 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:' a: N. q4 n0 ^% m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:+ {, f8 h) g# r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:8 o% v4 j7 R* c3 F# ^+ g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
+ ~( y& T- n6 U6 j0 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:! K' [2 K2 N9 D! N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:" I9 D5 p) W# L, S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:' k- P( O0 D" e) a N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
$ Z7 m+ Q& G7 H9 T4 Z5 x% \% YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 j% N" \# v4 u5 M2 Y* FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: S5 \9 W) j+ Q2 K9 ^4 K) c+ X& f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
! H5 r- u$ U, Q% j+ NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:' X1 L! C% }6 G* H; j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:, X: i* f5 c) w `4 x2 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
+ f* \: d% h. y) e# K j/ qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
0 q. y, L9 m z8 L* Q* \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
; D- k& w/ v7 z, K' h; BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
& f+ Z) g& _, h/ qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
: L; N: v, @( f! Z2 t6 S: dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:8 H3 K1 @$ \) T9 M( f+ h9 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
* ~: J, O4 X+ w0 q* ?& R# nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
/ A7 K9 A* U" `, CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:6 ]7 ~- ]" ]0 q9 ?. g2 [# Y. R+ Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
# O$ q9 J8 l4 g$ m' G0 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
( `% A+ k4 X7 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:1 h0 G E" D! N* u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
! a4 W' S5 V4 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
]9 O: B& a& u2 q! SSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
) o* Z# v7 k/ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
0 O2 G; G3 c0 _5 CFinished searching libraries9 C, {; Z0 [- k" p6 z
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
% u8 O" `) ^( d* DBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
. \, Z( i6 o& S5 zPerfMonDemo - 2 error(s), 0 warning(s)
4 q% j& _1 K1 v========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========* ^5 `. Q/ P- o" g# S8 @9 d6 K
; k. e) G5 G% h! ]0 B8 ?( k
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
7 t/ y1 R$ d. P# r& s解决方法如下:' ^# f# [- S0 l) X* s5 B
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
2 Y5 J! t' {3 Y! y; `+ {加入
) s. X. Y7 |4 F5 X8 {: v! q/ Znafxcw.lib% K6 e' E3 Y4 o# K5 r1 X+ s
libcpmt.lib- j9 z% h/ b( A: y/ a( \
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
1 O4 `' ?- e% B" C! Z- Q加入
5 n, v' z! ?' T5 c0 M, ?nafxcw.lib8 ~: t3 _5 O8 e. }7 l8 X8 Q! h
libcpmt.lib
0 z& H3 l _- ~. c8 t) w
: \% L2 s. f' g" R) [3 d( ]) v1 } 这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:) r3 _+ E' M8 D" [- u. M
; U; G' _" |9 C$ L; m
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 6 V D4 H8 f D w9 B2 ^
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
2 S2 c! O$ _' \6 D' ~) m使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ) r0 D% j, m" f4 @$ H% b
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib # i3 b$ |6 E5 b. z
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
2 L/ Z5 i" d0 e1 ^7 G使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib |
|