找回密码
 注册
查看: 5752|回复: 1

[收藏]VC++ 2005编译出程序在XP下执行出错的解决方法

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:9 ?+ |7 p: C4 Y1 e; y
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。( z$ i- t. E- G& T  Z; f% b8 p% n: Z
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
' |: B( K6 \$ YProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
+ |% Q2 k5 y; k% `- a- k7 @4 m2 B1 H' g
修改成Multi-threaded (/MT)+ `' ?9 ?+ F' B8 U2 O
; G+ m4 H7 s( n
修改了Runtime类型以后" ?* I/ b" ~5 Y5 V' q3 ?$ d
: F: j$ c5 l) Y
需要将MFC的编译类型也改成静态库:
! l: G7 d; g9 _% x6 [9 T, T1 @2 H" vProject-&gtroperty->configuration Properties->General->Use of MFC# \$ h; R# M: X1 C
修改成Use MFC in a Static Library5 C( x" P5 q/ i- F/ y

4 M. v; S+ F6 |0 U一部分情况下在这步就能解决问题% K+ Q& }9 X/ X$ s+ A$ n
另外一部分情况会遇见如下情况# Q/ I' z: C8 l4 F
: t! D* T$ \0 L1 {
编译器报错:/ k. G0 ]6 _: Y( X  ?* d) ?' [# L

1 P) [* d! d, g: fCODE:
6 n1 S0 k( m* Snafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)" T' i/ o1 E, U) n1 i/ s

3 x2 g" \% Y* p! R产生这个问题的原因是库依赖关系:
8 x$ f) Q& G7 w3 K9 T) }在Project-&gtroperty->configuration Properties->Linker->Command Line$ e/ {! K' ^; c8 w6 |
加入编译开关/verbose:lib可以显示详细的库链接顺序1 D2 N+ Z* Q: i' c1 v

% Q# n' T( N8 K0 A0 f- P& z# [CODE:
9 r0 V6 v9 p, t3 f6 [- Q+ p# `% _2 K1 j
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------4 u# _( ^" v$ O5 R, f) B
Linking...
- {# ]& ^% G! t4 V6 _Searching libraries
7 x$ R6 L/ C! |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:( d$ W+ h" S( l1 c7 w1 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:' a+ Z0 @0 E7 ?+ X& l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 L2 B  j2 B( Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:) l7 g+ t+ g2 l
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)  {+ R# |! @" q/ Z5 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
4 w. c6 l! f) vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:9 B. D. s+ u1 f4 K' C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:5 n8 {7 d- y+ `4 ]5 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
# E5 c9 z3 e0 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:* J8 k- U, y! W2 f/ P7 I, J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
6 G) ~/ h& l% p% S- vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
; L. r9 S* h7 n2 A$ a! u1 Y& g4 D  U0 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:$ q2 }) L8 z+ k% P4 `+ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:( n1 ?. E2 l0 {& z7 c! D) _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:; a% i1 p8 ^, M; D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
3 A% \" y' g5 a3 i+ I) J. FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
+ Q; E+ I% |) A1 v9 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
- A5 ~( W6 N% BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:! l3 z8 Q. \# a6 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:/ b- x3 j0 W- z# Z7 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:; t% z8 J% i. U  A7 E& N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
8 ~; G9 Q) v6 v! q7 f  j6 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
. u- ?5 i" Y, |8 R/ OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:" F; A  k  E5 ^) c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:9 I+ y: _/ y9 A5 v6 q. u5 a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:. p+ ?) L: K0 u4 R$ Y+ r' E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
3 P. p5 T4 m* a" q9 p, o- hSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:) p" `" g- c7 d8 N  ]3 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:8 Z6 ]6 \5 x8 @% y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
: Y" |5 X: J6 d& d" L* K0 v  b; zSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
+ r- K& L7 u  ~" F9 D# a0 s3 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:: d6 d9 t8 r, k) B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:. Q7 {4 ?2 g8 G4 K5 e6 B- y# l$ L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& _" L3 P" s/ t7 m& L4 O  f" rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:  ~  C; J4 }. p% ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
  H5 r9 a$ P5 d6 `3 m4 k# ?/ h5 J- mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
7 m& R; v* \% [. d8 w7 w( m: VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
% M) N4 I4 y% O7 N9 V0 @% U7 C& c5 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
$ W8 q( b# a7 }7 e' w% OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
( C  k) F5 n, i# nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
6 f1 P; |% O$ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:3 ]8 Z4 o: [8 s" F% [( }. a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:! u) E' m8 Q% `0 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:: B7 W+ i$ N1 z( z$ d- l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
1 h% I: {9 n5 z" _3 E0 l9 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
: v, b& q* j2 J7 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:6 j# u( S7 J* g( X# {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
* D, d/ z( p+ r* Q% XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:8 Q9 C* o# \. h' ]+ B; f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:- M5 P, _% k! r3 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:7 b! \' v2 G% u! a  v' x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:8 Z( Z' B& E9 [5 V7 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:! j. X9 Z2 i/ u# L- f+ p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 H$ S+ f4 a6 x6 GFinished searching libraries9 v  q* B' W4 [& {4 B6 U* r
Searching libraries4 v  e5 d# R( l3 i5 Y: y4 x" ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. O2 `" a2 W7 x! K6 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
8 I4 F* d, `9 c/ k( v3 j  nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
3 @1 z4 m4 Q! w* g5 v! O/ ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:; w5 s3 ~- D/ m2 u- A7 @' Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
# z6 U, b4 Y2 b- k# t  HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
+ b) T9 `/ e: }2 d6 Q1 M; FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:: y% g9 n2 f- A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
" t- L% z  N' P& _" B7 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
$ Q% u/ l0 ^( T* d+ GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:" M% T) X9 d8 L' W0 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
: z( S9 {, U2 ^2 I( DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
* B# T/ A# ~8 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:! E: P' u' h. e- I" h9 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
4 e5 l' R1 d! f3 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:8 w1 \2 A% v& |6 C3 z  p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:( a. n/ m6 Y8 B) V' ?, @" c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
0 i1 \* ~/ A* w- L* {, m& HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
3 \0 W8 M: ]* S' O) vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
/ H' u0 @$ Y% E: }7 z0 U9 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:$ v- h& k3 t2 d: z7 p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
* B) p* k, [( Q$ \; y8 l3 Q$ C9 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:) y0 i- A+ o2 Z# z! @. [$ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
! h' C2 E4 i" h* }8 J- {4 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:) E0 n' T  U! A& p  W' T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:+ s; d6 Y; w& T: Z: n( s4 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:. s2 }6 t! R, ~+ R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:, P: l8 m5 d1 P3 V& }3 {( t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
$ x7 O+ S9 J6 U7 c- @) C8 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:, D( L6 q$ [! `( Y( @5 Z
Finished searching libraries
. I5 u8 z9 T6 _* x. R- b8 j/ y! j.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
( f( Q1 Q9 W2 w' nBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"* g- U0 A( }4 J" l
PerfMonDemo - 2 error(s), 0 warning(s)
# z1 ]0 D& e& ~0 a' Y6 Y5 Q========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
. t0 ]  r+ B3 w: w3 ~
) Q. b9 s* S6 A" P. }我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
6 h0 H9 y- t) w9 d' j+ g  _$ t解决方法如下:% N8 K4 m' _+ Y
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
; R; M) T4 l" b9 E$ I: k2 X加入
1 h) `; W6 r* X0 Knafxcw.lib
. R  c( s7 Q1 U% Alibcpmt.lib
) y! y1 h* Z6 K/ Q/ ]* UProject->Property->configuration Properties->Linker->Input->Ignore Specific Library# k: w/ P' i& @
加入
8 Y* V( w1 K* e$ Q! c0 _( S% n, rnafxcw.lib
& r# A- ]/ L4 y# t/ K  v/ ulibcpmt.lib1 c6 e- D: Q. O8 ?
% {# C6 O4 d. G+ s) Z  w
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
9 m+ I! G9 S8 @9 i( T6 L& T9 ?: C/ Z5 |
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib $ V# g& g) B9 \9 @: p5 e* L+ G
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
7 @3 j9 i: u: Y1 S# N) s% e$ B使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
$ E# M. U7 w3 x& a3 m$ F调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 4 M# Z! G5 Y. ^. G7 ?
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
" A) `& b' j2 [% ]( B" i; U# k使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
 楼主| 发表于 2006-11-14 15:23:38 | 显示全部楼层
msdn里面有解决的办法,在重新部署c++程序里面有说明,建议采用以下两种方式来重新发布 Visual C++ DLL。首先,可以使用 Visual C++ 可再发行的合并模块,将 Visual C++ 程序集安装为共享的并行程序集。, r% u: Z3 V( G2 Y% j5 ^# d+ y
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,# p5 c5 f/ V0 Y4 }  p
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。5 S  b: E3 f1 ]% }1 q8 J" c: y
楼主的方法容易误导初学者
) u( K& ?7 _; B# s
( z' f! n, ]; n! x4 A( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-10-2 04:11 , Processed in 0.018766 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表