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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:# r7 S$ T- O; m
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。1 s% s- `& Q% v8 ^" b
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:* T" v& h$ T5 i$ `6 U
Project-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
5 J) o3 p! f6 Z* @( m. U- _+ e
0 V5 d/ I, h' U4 E2 Q1 U2 L- ]% Z修改成Multi-threaded (/MT)
3 @* l$ \3 `" f( o1 v: h4 f# p7 P: R3 w% Z, o9 x
修改了Runtime类型以后
& K7 r# D: A" |) F; @
+ Z  |. ^# H1 f( ?0 l/ u% M, Z需要将MFC的编译类型也改成静态库:5 F+ k. }5 o" C# u8 m8 o) ~4 a
Project-&gtroperty->configuration Properties->General->Use of MFC& u3 |* O& Q- @( m* F5 a; o
修改成Use MFC in a Static Library
1 V+ D6 Q; ?8 O6 K7 _; N5 u/ Z& Q6 x7 j& F) V
一部分情况下在这步就能解决问题9 E$ J& f* v- j* S% z  K: B
另外一部分情况会遇见如下情况
4 [7 A( ?4 D( E: b) F' \  u9 q2 Y. @: v$ _
编译器报错:
2 S6 w8 z: k% T. u  `* J* T
$ y4 v( h' r3 [: P! y7 bCODE:/ }7 v  O: G( M" i( O
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
& y1 Z& q0 ?3 L. L8 u* v4 N" I/ K& @
产生这个问题的原因是库依赖关系:& v  v, q, b5 t' d; R; Y$ \0 }
在Project-&gtroperty->configuration Properties->Linker->Command Line
% B; q, H, `2 x. j( |加入编译开关/verbose:lib可以显示详细的库链接顺序
% \( F* L$ W' P& O4 f4 P' J3 \; N# b
CODE:, u8 O, X5 j( i6 j& T
+ {5 `' Z# ^: ?% g1 d& r
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
- B* Y+ n2 K7 z+ {/ x+ yLinking...
* ?8 U: ^! q# a* y4 u+ A9 _Searching libraries
9 @2 \  a6 L: A' mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
' U# V  B, V- z( W0 u6 x  vSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
- i+ ?9 {. U& ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:4 o: f; d5 _" G9 E# N9 b1 S2 A* N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:7 K. y4 h6 b, U, Q
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
, L9 @7 X4 \) B6 \( u$ f$ e3 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:  m  G( r5 L: Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
" i- N4 `% g* d' S; kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
; Q; Y3 S6 i3 C: w; b4 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:9 G% N7 _% M0 ~! ?0 \, H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:2 ~* l7 w* B0 e1 C1 Q' t0 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:+ B% g* r6 |1 H% q6 G7 V2 K& o% B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
: @7 K% z8 @% r# B3 r$ ^' ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:. k* p$ R/ L) F) T; @* l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:) ?1 Q) `: ]2 a8 |& Y( H& W+ O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:1 _, n3 c6 w/ E, o/ {, b( l" y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:7 |$ l( G1 l1 @" j& M0 ?3 `4 {; x. D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:1 ?) y5 G( u/ w- c. r; V" X4 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
. F7 D$ G5 D: z* I4 Y% f+ D7 a# q( WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 H8 M% f5 _. L9 ]$ t2 k& z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:- M. C# p% f+ |( ^6 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
& X3 K" `3 @7 {4 t9 ]& b- [$ ~* dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
3 t- f6 p8 R& J# C5 R, HSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
& Y" g6 d9 T1 s! QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:! i8 E( m: @" i8 E- P- `; H; Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
! o' |- q2 U, l* C. j; l9 n/ [% FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:( h7 E# D' Z- M- F  b& `$ _+ V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:0 b1 F5 `* B! \! R6 ^3 x6 \! f* m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:1 D- l* |1 w2 g+ ]' g! f9 B( P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:/ u& Z5 S. P- x! }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, `+ m& I5 y6 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:7 T, \" A. d) V* g8 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:: m/ {+ H  v3 [+ n1 L! @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:$ R3 b$ t5 {# f# N0 d" N% D# p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:* q  ?: a2 |  M. s7 _6 u' X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:2 c/ G1 a( ?+ @  d8 I3 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:( g5 m! `$ F- o& ^6 O, k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
5 {( @8 m, t' M; x2 ?0 B; `) uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
7 C, R8 c& X1 B, c; OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:4 n4 q  Z8 p( s3 F: q2 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
3 ^. {1 J( o* uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
6 H: a- ~- n7 G9 x6 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
& W2 O) V( ~! Z6 g6 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
5 V5 o3 r: s8 R1 a0 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:# n# S) m# t: f8 r+ `4 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
! \' A  o: K  D  z3 E* }' YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:' m! b0 p' A5 O( |# N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
, c& L' M) S/ i+ F3 G$ nSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:" Z" E& z" H: D% L5 }. z/ `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 M4 a( ~3 X- Y: e, D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
; U3 l" m; q2 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:  `  S. z: ~. ?( k4 T4 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:5 h% q. V4 N, U, ], F, B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, E( O: f9 R: N! r% G$ bSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
) C- @3 W2 G: p& ?Finished searching libraries
! U" _- X+ s; H+ ]1 SSearching libraries( T* {& ^) q9 ]5 R/ n, V" G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:6 o( J7 q8 Q1 i) b7 T# U: I5 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:1 x+ R4 ?. i6 Q5 L' s- f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
8 I& w7 p# D( v9 R- kSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' H" k9 f& m* q4 t( u9 g6 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( e- Z) G) U' g9 }/ w  s5 F/ ?' V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
9 H. |/ x! @0 j" {; zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
  @8 D0 Y+ |; S) ^9 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:# F4 `, [  w  |) k- W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:# l! n, M6 `/ [2 R6 x; w8 p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:3 ^) \, R5 i2 k; X( f" p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
& A' x  V% [% lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
+ H$ ^0 Y9 l" _+ Z) D3 ]! ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
% ?5 }& F# \/ B6 M& _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:8 g7 f8 j2 X5 V" q$ P  {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:/ F" ]* j; Y4 x# N* k; s; D, v3 ~: S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:5 |1 J6 r# J' O0 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
) J/ `% |! Z* ~4 g- T' dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
* j+ m: P4 r1 M  X; M  A* b: _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:! |8 }6 w0 U! B( C  n$ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
! ]5 H) p- K% H* W$ ]4 p# C' n* {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:. d( c' ?4 ~" C# c; P+ ?5 U0 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:; K/ |" {' k5 A6 }4 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
1 j. V  x5 |9 X: N' [  f, `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:& h" A* j" Q; b3 r! i2 |) q0 g% M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:! L3 r9 B- T0 K' Z( x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:4 O5 z; L2 J7 f9 r; b% |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:5 ?7 N7 |1 W# Y9 @5 o: b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:3 D. a8 ?- o: K5 A! |4 ^/ n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
+ d0 I& ~/ G5 r, U' E% RFinished searching libraries
3 M( X# H& A* Q7 c: ^/ Z: L8 i6 w.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found' A! i5 R, y/ S- i
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"* d7 R$ V  c5 k& w( T1 T# Y
PerfMonDemo - 2 error(s), 0 warning(s). |1 `: E* U  g, J& X
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========: R* [4 ~3 R) g

* Z4 v1 M, I# R0 g7 |7 {我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。# I0 g8 @5 d* E. o* v8 J) n
解决方法如下:7 M  \. y* D1 @3 H7 w
Project->Property->configuration Properties->Linker->Input->Additional Dependencies* x0 J* c$ w/ F/ C# C  ~) D
加入
. {: y" K! l( U% d3 ^nafxcw.lib" u7 n, g1 a4 O( g" {3 y
libcpmt.lib9 B; q! k; a2 t# G4 x9 l
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
5 [! }  L7 q7 p$ E加入
3 a0 A3 ~- u7 }! o2 Dnafxcw.lib
: g5 h! B+ r5 M8 `libcpmt.lib
* O6 m. Q. t' z# g/ x) J* W/ ~  z3 V/ W; q! b
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:* ]0 m# |: z' g6 D" e5 I+ |! e
5 P! e5 A; {1 ~' m% \' N  _, z9 U
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
( d* e7 }* y- \+ `多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
: \; ?9 s% K; S% [2 k使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib % M8 H+ x* B6 e$ Q! l' {
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
/ K- D* N, v8 a. `! a调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib ( H; Z8 o  X7 \4 P5 o3 |
使用 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++ 程序集安装为共享的并行程序集。9 I1 H  L; E% s, _- ~: x
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,) t' x  k  W/ T5 C
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。% W1 A  V- q+ k8 z( f# H
楼主的方法容易误导初学者6 z) B$ g; v" t2 g1 z" `2 K& Y
7 c) d: W8 p- d; N1 p; A- ~
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 22:53 , Processed in 0.018548 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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