找回密码
 注册
搜索
查看: 5305|回复: 1

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:# V' R% Y4 F6 q% ]1 r5 j$ Q" p
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。1 _5 w0 Z9 I3 s6 f. H8 n
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:; C1 X5 w% q) s% k& y
Project-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
! X8 _" F- O* w' G
, {! O- p7 _) e5 i% K1 \9 g修改成Multi-threaded (/MT)
0 Q# F, q6 _5 [" c# K/ U& J8 O0 b5 O% Y; O1 R
修改了Runtime类型以后" g3 E$ {4 N8 u8 o& d: B3 T

1 N5 W8 m* b% Z2 D3 e3 u$ L需要将MFC的编译类型也改成静态库:$ X. |! @7 Z$ U6 J
Project-&gtroperty->configuration Properties->General->Use of MFC
9 Z" a4 F5 R: x& O3 _! S- F5 r: V修改成Use MFC in a Static Library
8 ?! t. S! s" b/ A, j9 K
+ y3 n0 o4 Z; U$ Z7 ]$ R: y一部分情况下在这步就能解决问题' m3 X) \: i+ n3 P/ Y/ o
另外一部分情况会遇见如下情况
3 d# a/ a5 L6 i- K5 w; P
- G4 H/ D$ `! ?编译器报错:
" _+ r! L: r# Y3 M, V" t
! ~6 |: {# r7 i; R' bCODE:! Y! k7 e3 B& S3 N' q
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
1 T5 d, o  [$ ~7 j2 ?& q" c8 S# }' Q- z- J0 j2 }1 w
产生这个问题的原因是库依赖关系:
0 R* c* p7 Z2 v; O% r在Project-&gtroperty->configuration Properties->Linker->Command Line  G+ P% }0 d' S( g1 W
加入编译开关/verbose:lib可以显示详细的库链接顺序! y1 d) F' j- D  r. @7 R+ P# n
  |; |- o. |9 A! G5 r& ^2 n
CODE:
  h; M7 N9 U2 I! j; I( i4 b0 ?0 |4 R) ]7 p' B+ Z$ v4 G( I; Y
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
' p0 O/ z6 r  L, ?3 j: tLinking...) B1 e4 ^; _) {) ?
Searching libraries
( ]! u  j0 ~+ v/ cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
4 c* z; ?9 c3 n3 {% j1 e8 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: U; r+ h. y& S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 X% b  }+ d& c9 X6 I2 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
3 F: |+ g* z9 ^+ S6 B# c- h' Q7 S1 cnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)) n0 K( D* R1 n( m& {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
( d: D6 D# d0 Z* q* X4 _5 w6 cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
7 G" ~* t3 C' vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
! \8 k5 F2 E* f, W  I0 D0 K3 oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
; B- u1 o- U' M7 e8 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 W5 c# t! [0 F$ ~7 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
5 j+ {9 l; |7 E: LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
1 v" G* ]: r$ X6 u7 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
  C4 H' m& L# ]9 [( _; ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
! q+ f  [7 |4 H( o' LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:! [$ A: d: @( D7 a; ?1 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:7 _% [# `. v: p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:  V2 T' z5 v+ `: s9 J# X9 j; T, X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:3 X2 n. b% K- T) |( s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:: O( c+ C+ p% }, m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:9 [9 K0 ~) _* J8 R" Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
: C8 T& d" ?( k7 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
1 X1 L: U) e5 M$ GSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
: ~( h; F, S  ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:& ^0 A# J% g% d6 j/ R# l7 B; s: [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:+ a. _- |: I  Q0 `5 _) D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:3 U7 f9 ?3 Z, I: _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
% ]7 _5 l; R8 G# k" ESearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
" j- r( I( n4 h# a6 l. E% kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:* J6 O# ~# t" O  ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:$ E0 @& w6 \8 u& I. Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
- z+ h' H4 e: M0 p# [3 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
0 C4 [) L! y& E1 |1 [% ?$ L0 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:- r% X$ ~7 x: S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 g7 D/ \  J/ r6 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:6 {0 f0 z, C& o0 \* k3 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
' @) M4 l! B: c) Q1 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:6 N" Z: P/ L9 ^. k* P: h* O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:& O% `7 _' g3 \" Y! \; [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
0 U) ~. F# N# s; B# |2 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:; @) L" P0 h9 H# F( q1 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
# W4 w: ^2 D. o' z$ U4 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- J, w8 S* U! P2 ]5 R& I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
) X8 B9 N4 F5 G5 h, o6 @' ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
# }6 R* C& [: KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
5 e6 P! z: S, P7 a. RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
' S! J& N7 e( D! d2 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
+ Z2 f( r# b  G7 x1 I' e/ kSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
0 h! D1 W& t! G5 z) l2 F$ zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
) m( a* s8 |% d" sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
: \: S2 P- s4 ^" _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
2 y6 z+ g' `% _8 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. k2 ^6 @' `5 ]  cSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* n) d9 |- B3 k  R) _0 }+ D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:3 H- r1 r( T3 W
Finished searching libraries
" s8 O; B: K1 x2 t/ NSearching libraries
$ e: e4 W0 E; c4 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:  L) @: ^# ~. ?; s7 p  h9 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
6 G9 y3 v7 w" {9 T0 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:- r/ m8 x: m" B1 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
4 Z  ?% b' L3 u1 y5 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
; W* }+ Q( C% m( K7 q, Y4 S$ USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
2 g9 `( c4 s% K+ c: i5 Y2 [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
6 j( Q3 r& ~  Y2 E# P; W: zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
0 @/ r( T7 F  e$ }2 Z9 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:3 E% ~6 {& }8 @, w0 O0 z2 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
- M: Z0 Y: Z& ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:' }& t! N- H# O0 w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:( k, k% d. D2 A, A- L6 ^9 \3 _/ [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:; M1 a+ Q, I* i& j6 A  N# q+ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
  P6 ~! X6 C7 c- d# ]( S' ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:; V( l. f( u: F' W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:' O, _9 S! _" k' h1 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
; T. ]& j4 j# s5 DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
% k7 N2 l8 P$ p6 k. ]& {+ t0 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:+ X7 L% r3 ~6 ^5 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
; V4 z+ l/ A, r* |  O1 b/ y2 W" }Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:% D  G% ^' b4 ^3 n+ J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
4 V( R2 }6 t- d7 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:, O1 y2 [* X# p+ m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:  [! v$ s) D) A0 a& C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:( `$ k& ?& r. r1 v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:# s7 ~* f6 `  j! C3 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:: M) @0 Z. w/ T5 Y3 n/ {3 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:% l: a6 d* s& s8 S; n9 Z; Q* C9 h& S7 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
% w' p- E# {) a* K) J5 y, u) B9 fFinished searching libraries0 q. S2 K' D7 t! E
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
& t" D) K& Y) c& PBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
0 r  Q! ?9 ?2 [3 n" a* pPerfMonDemo - 2 error(s), 0 warning(s)$ f  F  p! f! c, v5 ?
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  Q' I0 ]9 E$ ?( m1 Z3 W2 D" ]( H! m( P* A
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。) L$ }' U& \6 @& w9 c) |) ?
解决方法如下:6 `7 ?4 ~1 D& @# F2 a$ V0 n
Project->Property->configuration Properties->Linker->Input->Additional Dependencies+ m5 w' R5 U1 w& [: Q+ \5 s
加入$ @) x  {' p# j
nafxcw.lib
( W+ T3 U8 w: s6 o3 E+ S- W6 ~3 `libcpmt.lib
- F$ c! v4 O0 |Project->Property->configuration Properties->Linker->Input->Ignore Specific Library, V' V4 q* H. ~
加入
. d2 I5 a& p" [) I' ]nafxcw.lib! V3 S! k) M3 t5 j4 y. ^2 v
libcpmt.lib7 n; D+ }$ r9 ^4 M6 p4 \, Y2 m- ~% v
# f8 U6 ?. {& V, L8 g! `# k* w
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:  G" E  S+ X) g/ j

* a* f" d0 j+ K单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 i2 B2 u% g1 l4 f8 s4 J' @
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib $ f& f1 \8 v# S6 Z
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" s6 J; S& T5 X: g3 k- f0 j调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
/ p" I$ N+ P* b9 U调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
' |( D8 u: f! |; `$ Z使用 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++ 程序集安装为共享的并行程序集。. a' ^; ^" M/ O
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
1 f$ q( R! H$ O( e2 Z& V. E" _就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。
* t- @5 E8 r7 C& P! p) [楼主的方法容易误导初学者
: k/ N, Q5 }$ \) k7 q5 D4 z8 M9 K# w- {' o. _
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 11:16 , Processed in 0.035614 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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