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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
( u+ w$ K& r; }: G  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
9 N' `' m3 ?( g5 O3 N  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:1 u* F( v; ]" y7 y
Project-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
- e- k; l" G$ I" ~+ D6 h6 B& @' a1 N/ T0 `& F9 q/ j! k/ M" f
修改成Multi-threaded (/MT)
6 E- [- a) J" l; C! }
+ I9 N" Z7 T. T" f修改了Runtime类型以后
' j0 I* k5 {. c: u" e& O" y1 N" j: ?$ i7 T: k. O! g1 N, r" G6 W
需要将MFC的编译类型也改成静态库:
: L" G3 c8 S7 eProject-&gtroperty->configuration Properties->General->Use of MFC
) ]& z$ L- N" N( I修改成Use MFC in a Static Library
0 L, \) L0 r9 z0 m8 H/ K8 Y7 p) S- k& e  @; ]8 f4 e  _* j, G
一部分情况下在这步就能解决问题
3 X- D2 N+ }5 x) P" ]3 j& X  U另外一部分情况会遇见如下情况
& s4 K9 t8 T; Y* w, S6 p" J; x) M% o( k
编译器报错:
1 w0 g) }8 d6 R) b  p0 _) b6 T+ m' \( m) C9 v$ t% r; r2 f
CODE:
% f; u# Z/ q6 n+ z' p2 p( inafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)- l& I; S* L) Z) U9 \

& o* n8 }! ]" C. A& x产生这个问题的原因是库依赖关系:  O5 V  y) s! V1 I; a
在Project-&gtroperty->configuration Properties->Linker->Command Line0 Z, K' i, B% a- D  L3 s- P
加入编译开关/verbose:lib可以显示详细的库链接顺序: A, p( I+ w: I# X0 F& P

& ?  q+ O4 g( X/ q) L! WCODE:
3 a3 _8 `0 j5 b) e9 X7 N- L
. [* P6 e( y' c* v------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
+ g: {5 g9 i. U6 a8 d2 gLinking...
) ]7 [6 C' L" v# I. o  j: m8 LSearching libraries
' W2 D7 g) y3 ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- i# v0 ~' e  ]( uSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
2 Y1 W- W" [. |& l5 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
. h! g" \2 H1 _" M0 X7 H: H' n& aSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:" J: o) X& B" C# I
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)' S$ \+ d% Y$ }. c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
( S: D0 D" k7 S4 i  C! j4 w) H9 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:7 X* d$ E8 |9 e9 `8 o$ b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:. f( h& b) \0 Y3 e0 ^9 f& X9 D1 ^% x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
* f) z2 Z" P3 a5 O/ f, s8 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
% ^) M4 U/ C9 m* y" U/ {+ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
$ T2 _2 g8 N8 f7 y6 c% KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
, f1 j% z% k, v9 S  C! M3 }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:9 u. f2 b( W; b+ y9 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:3 ?5 q$ t& E3 L! Y: T* g8 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
) d4 ?& v9 T% W. ^2 K2 v# V; qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
, ?2 R: L& {8 m; [4 h1 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:, m- F9 J5 s9 s1 I# {) m$ o$ z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
1 V7 O: g" T6 g; h, aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
7 D; _" O, f1 `9 p' TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 F! R0 V% x5 ]3 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:6 q9 l2 H% ]* o/ L# o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
- U) r+ }% S# d4 ?! KSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:7 z, g: Y4 X/ O0 B2 |: s* Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:* S1 _; B6 a3 u4 }, b' q9 a  S# y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: \! b7 {3 W3 H! l. a( ?% \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:4 x* Y! X8 n5 R9 _3 U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:1 _6 k# v/ i* H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:& a6 b1 E' o2 W' W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 z! ~& F, {. w2 G4 ^  [6 J3 wSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 E* O0 c3 R" w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
- f8 Q' O8 C3 S& l. GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:* ?/ N+ u' P) d& t# \! G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
3 R) x' Y5 w* t  l( ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:( p7 B% h9 l; q& n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:) K* C2 r4 `$ V4 m6 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
9 W2 {  P  Y1 e  YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
% A) i. A0 f; q, W/ _2 \: L! uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
& _  a- ?/ B' k* j0 E4 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
9 Y- d3 O3 t! G) e, _8 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:/ I% }, D1 N$ x# k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:' t1 k( T- v5 t& u. C% M3 k/ j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
! A5 N0 J# w: k6 z4 L  }1 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
! P, m  A# \4 U$ A8 C$ R$ L, KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
* w0 x! s5 C' MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 a1 `  a  z- ~6 M+ w* jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
# p: }, |. F7 P( ^: @Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:; Z5 p) V5 h- N& [8 e- U3 d( v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:! j( n: |! n5 c7 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
( e$ G) [' q/ G: ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: E' h5 l' a3 _( S! z8 ?( Z% V$ C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
: z; K0 ^7 }+ t: _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; H" l* n" S) [) x/ }. nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
# m* f5 b, V) r2 q5 }4 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
  f4 W  j' ?. t7 QFinished searching libraries
8 l* @7 F/ ^$ l1 t. xSearching libraries9 y4 R6 B$ M# Z# |) R* p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
) A( }) B) Y0 K9 S$ G$ ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:( O- O6 {2 l2 r/ w& u3 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
6 b. g1 ^* g( c, F# N" JSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
" X! m, \# j7 }5 l( s  x& nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:8 K  b5 ], E( K; V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
! L, q9 t! _1 P  b4 Y3 U( _' f( C: U# pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:, e8 Q% ^8 L. E0 j' h2 K* E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 s- A# S% s5 g8 c% E% LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
/ d  i% P! _3 `" R$ fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:) }8 Y6 n# n! {8 \$ Q4 s2 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:0 q  s" ^& |7 ]" t) T5 A. W8 F+ D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
1 |6 v: [2 Q1 ^9 @) T, ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
/ E9 b9 W! @0 B  O. PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
/ ?# |7 {6 |& R+ Q6 l4 U6 q  iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:) R& D" P. n% j& \: _0 Z8 `( |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:+ G- k) K$ D% p3 b& y3 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:3 L. q1 _. f3 t% Q1 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
; h8 m! I! S) T, e" T& w0 b2 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:% a- i* u1 D" h% t4 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:6 ?' I5 [+ k$ g; G- d- @* X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:- D# Y& i2 h, H* @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
. u0 I, P8 _' Q9 h( |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:! \+ y$ s# k" O8 |- ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:6 G/ U" N" f$ J- M0 L  D- A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:9 p7 H$ f6 ^$ R* W3 L1 r# b* @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
$ J+ X, F) n2 u& W( USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: t; l( L9 `/ n+ ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
7 W9 s8 i5 D. P; wSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
( o) t, T1 o/ N$ @" iFinished searching libraries6 S9 z* z( c" b7 E0 u0 `- y
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found1 w6 K4 U2 w7 @. A
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
- i: G+ a! {0 u! o: l8 B: EPerfMonDemo - 2 error(s), 0 warning(s)9 R: q6 A( r+ y
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
; D& Q% {( r0 _$ y! W' v4 J% I3 A# L" T0 `
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
1 C  d: J5 l! m& X9 @解决方法如下:! S9 r( b- |5 J+ }0 D  w! n
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
1 K. p2 ]* a" d6 U加入5 \; _5 p/ n! g7 |
nafxcw.lib
$ Z0 R0 }: O' w# s1 c3 ilibcpmt.lib2 d. ?% B% w1 Q  A- ~7 ?: |
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
% ^; y2 t" H+ ?1 x加入! ~9 ]4 h) k/ L! \; A. e/ }% i$ z( P* V
nafxcw.lib
* n, s5 y! m8 L7 {5 Q: Qlibcpmt.lib
/ U$ A6 O! M% o, {
/ x! G6 N- C7 G  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:8 X* c9 |+ {9 Z8 q* @% @) K$ U* ~
: ^" u& B7 @" `8 N
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 9 {" m3 i, C" U
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib $ R+ A1 c. |) N( _# O0 S2 z
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib % g3 i- o( j, u# y$ K
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
5 `+ ?7 ~' B( z" Z* ~! j/ l调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
5 R3 h, s7 ]% C7 X8 b. \使用 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++ 程序集安装为共享的并行程序集。
' m0 x$ R4 ~# m# m或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
; @8 [& t3 Q. C% [就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。+ N  e$ w2 L$ @" x1 ^
楼主的方法容易误导初学者
0 N1 v) f" K5 o1 N* M; I
6 u$ ]% ]# F, N8 D5 ]( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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