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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:) X) G$ ?* U1 Y% w$ L' _
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
! x2 P( J) |+ O0 S( k  r7 u  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
, c, e+ F% _7 C* LProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library/ w/ x: E0 |1 y4 c# U

! b2 R' j0 C+ U, g9 Q* ?修改成Multi-threaded (/MT)  K" I  ^% G  j9 \4 m
% @! ]. h  M: Y) n- C
修改了Runtime类型以后
- P/ b7 l( D/ U, @" D
& H% G' A4 E# s- @. P, L4 r需要将MFC的编译类型也改成静态库:, S* h/ k" q4 w4 @# ~5 P, ^) \
Project-&gtroperty->configuration Properties->General->Use of MFC2 y+ }* c& i/ l" k9 n2 q
修改成Use MFC in a Static Library
- M& O$ ~! T" s2 ^8 o& c# P
; v/ Y9 }/ ]% b! m3 n  O一部分情况下在这步就能解决问题
- C) l* p' B! v) T. g7 m) G) _另外一部分情况会遇见如下情况
2 @( X% g3 X- H0 W% m0 `  B' w" w& M
编译器报错:
' W0 ]. D' I$ f$ p! D! D/ s6 J! e6 z: W
9 q# T; X6 Y* z; jCODE:1 m7 Z9 [' q+ e1 f: J2 |' O
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)* g: d! @: H7 z- c& D3 R
( l* Q0 r& |) M* A' V2 `1 Z1 O, L
产生这个问题的原因是库依赖关系:* ?" S3 Z" C& g0 Z& u  S6 O
在Project-&gtroperty->configuration Properties->Linker->Command Line2 p6 }; r& J, M# P+ N
加入编译开关/verbose:lib可以显示详细的库链接顺序( m; E$ x, k! L' N* l
# n. n$ s  y) [' [! J8 ]7 u
CODE:8 I& ^1 A% h; t" M) L/ e
* O& b# Y1 v+ A5 p% m, {+ \3 w
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------5 L4 ^8 u2 [( l% h; \. |/ Z4 J
Linking...* |4 x+ K+ o% @- e
Searching libraries
9 [( }8 O+ ?- a; y1 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 r' e. f9 w- }8 G/ G! U$ \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
+ Q2 }- s% U$ j# j5 f$ n4 K3 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
8 o/ f/ A! I. s6 J8 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:1 H# e2 W# w3 Y$ @
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)- J9 U9 G5 Q4 o( ]' g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
* {7 a' O) ?7 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
4 H+ `% G: O" gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
/ N3 ?% J% F, @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
9 E" J* u; s2 N  ^/ \( pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
5 J% \4 t8 T3 f0 i& z; kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
7 h1 D' u, k% l) U+ GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
: ~% h9 X6 \, NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! V& s( A& M, G$ o3 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
3 m" W& i. X* m0 ^8 D/ U+ RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:9 j+ M1 x, O+ |. f8 B! e4 u. k) G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:* z& O) i1 l8 ]$ ]& p0 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:6 Z6 k. L! T# w% g3 U& j' Z  G) T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
& }# c: m6 y. |8 C1 d2 r1 W. ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:1 C2 Q) X) s$ J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
% c  L) N* |: b+ n/ P$ xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:' j6 R# [) B/ r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
/ c- v- L2 n& v" l5 q4 b4 |0 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:; {" q& s0 e# p9 q1 b) G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
, x7 j6 m/ A. W$ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
0 a4 n2 s; I# |9 r) V, D0 G3 v' c& fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:% u+ a2 K+ R8 e( z- Y1 h( ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:; B7 k8 }& d# }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
" Q9 r; P# ]! M* d& ~) DSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! Y$ R/ s' Q( |Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:# t6 s1 B" S5 J6 X% ]/ M4 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:0 r; B& {" M/ p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
+ n* G7 h; V  kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:1 J2 l8 S5 d( I  c) {# w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
4 g% f! W% J0 g& p; ?% E! i' H: zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:$ }8 Q; _8 Z7 T9 s! S; j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:4 r" u' {7 Y: H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
$ U3 N# t3 z* e* L4 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ u' X2 v  Y. p3 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
, {! x! C6 r. W: nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
$ x8 y/ E( s8 |+ w9 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
2 X4 ~# p$ Y' n  s: PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:$ V' Y+ ~; Z! x3 y6 q0 N' h& \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:1 ~2 `; l2 ?! T2 L2 C% z6 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
# C# a% ]9 _! N0 T: xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:7 g" y9 `+ X  b0 `* G7 D* w, u( {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
, v- t, q- w# T  A7 e( F6 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
5 j0 u" a1 _6 h2 q0 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:" V8 |$ ~7 A1 m" ~/ @5 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
* T8 {+ M3 K% ^5 C2 ^4 |1 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:) a. A& h$ @" o+ z$ g. i, u; t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:$ y  E) t" H: d) ^1 A8 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- c, i& O8 \3 O5 s% rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
! s/ ]* `6 F- G$ h5 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:5 i' A( K6 N; r) S
Finished searching libraries0 ]5 u6 m+ |/ K  z+ o9 K+ I
Searching libraries
+ t/ x0 ]- U! K0 T7 s; m. D0 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
' C* M4 b. {0 q4 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
1 \/ D, c3 \& m* D; B4 o7 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:/ n0 c3 D  L: v% ]" v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:! n6 _$ a. d% |9 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:& m; B. S6 Y) T% {/ \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:) P9 L( |$ A+ g2 ^3 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:/ W) u  g2 k" C) w9 _8 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:% @. R1 j7 _: k) X& ~2 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:+ m& I9 m: \/ p# a8 C: ?% s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:; G7 P- C! \0 k0 d1 N) c$ w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:4 A5 N3 l" v& m/ M$ y0 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
9 {4 G  X$ M7 c# t  U. t. ]! T1 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
( H1 z. V/ n/ |' {* t  ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:# c& f& H/ B3 `3 b4 _5 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:% e7 k% s0 J. r) R+ C; o1 j3 z& r9 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
9 n3 w. j, r- c. _  @2 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:! \  P4 a4 r7 S  @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:* \- j. k4 f4 k) T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:/ G. n" w0 l0 M8 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
* ]2 R3 |7 Y+ OSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:" U3 h4 M, w; W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:2 `0 i/ R4 w" z: ?4 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:/ Z( y7 r1 B. T3 W% R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
* }1 I% I4 ]: x1 R/ @2 k5 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
  ]' r! G# c8 N6 s0 P/ WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
: |- A9 ?' v5 b* y  A. oSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
7 F& l% @" |$ M7 H( JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:$ t% B8 v  ?2 e: H9 a. K& P1 `$ {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
9 R4 K5 {  }1 H* S4 r" SFinished searching libraries
/ ]8 M" G% ~0 q7 ~.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
2 U* N/ E: `& b, ^5 F1 u% Q( T0 _9 sBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"7 E* q/ W5 f0 h% R
PerfMonDemo - 2 error(s), 0 warning(s)
4 b4 B5 G, |- q; P========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========! U1 M" t" j0 v0 ]

, ]& ^3 B0 \; Y8 v' \我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。6 J0 g& [* r4 j2 I  f3 u& [
解决方法如下:- P/ J! G# E5 H) f5 w: o' Z
Project->Property->configuration Properties->Linker->Input->Additional Dependencies- o4 m# C( y  ^, Q! D/ d6 d6 Z
加入# q+ o* i: F! A" _$ L$ c' e; O! T& E
nafxcw.lib
) _$ j  B7 {) q8 N; |libcpmt.lib
# B9 r" h( K# z/ E: _. R) _Project->Property->configuration Properties->Linker->Input->Ignore Specific Library0 r; ~. M' l% Z% ?! r, M7 @. H$ V+ @$ |
加入( V5 H; x. d9 \; A1 B
nafxcw.lib
; y" o4 K2 u3 [" f: t" C7 O. Ylibcpmt.lib# J& j4 R- I5 l% {0 _
( M+ L7 s  z1 I" M. |
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
& |7 {9 Y; i) F* `6 s! S2 U" \6 y% W
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
' e) w( ?( v1 x( r1 M, x# A多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ; P4 O* V0 _- e( B. c0 \" m9 K
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ; ]" V# l; P/ w$ B5 C
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib ! s1 b3 ^( L# Z9 R  e
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
: u& A$ S1 [( m% t6 e, }0 F/ ]2 j使用 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++ 程序集安装为共享的并行程序集。& M8 g6 ?3 Y# I/ {1 {; h
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,# B# E  ?7 O% Y9 b1 J! z
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。4 f# E9 q/ c, |
楼主的方法容易误导初学者- N) L9 K" u4 y; _0 \
# ~1 O: P' x- ~7 I6 W& `9 C; i
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-2 06:29 , Processed in 0.018639 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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