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

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

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

2 ?, \/ H. [- ?! x' F' C7 A8 L修改成Multi-threaded (/MT). ^- S7 Y' o6 F/ k# Z

) K# q2 U! l' I; [1 a修改了Runtime类型以后, `4 E. C; T+ v2 N! a( M2 ]- c
7 @* Q+ y/ c0 e, g5 l
需要将MFC的编译类型也改成静态库:
5 |/ L) P8 p0 `7 H$ h1 FProject-&gtroperty->configuration Properties->General->Use of MFC1 Q! x# v6 E6 |  Y! C
修改成Use MFC in a Static Library# G+ ~: @4 ?. A9 x/ Z7 E5 q! m) A* ]
) T. X. d! U  k6 S
一部分情况下在这步就能解决问题7 W4 h& N) j" W
另外一部分情况会遇见如下情况/ H3 m4 i# p) f, ]; X$ b! u
* i. L, o5 ?3 g, Z( Q  r" z" X
编译器报错:0 q9 T9 t" c9 v; Q! X
/ d6 Z9 n7 w/ y0 L  Z' E2 C
CODE:/ M( ~2 Y) Z8 w1 D, w9 Y
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)( T7 Z! p7 c" B+ V$ w/ s! [! h

* l4 h7 V4 d8 v9 }# C- D. q产生这个问题的原因是库依赖关系:, x, I. ~- ~# {$ X; M$ @' N& P
在Project-&gtroperty->configuration Properties->Linker->Command Line
1 e  \8 Q% i/ p4 W4 [; f加入编译开关/verbose:lib可以显示详细的库链接顺序5 |* i; f$ E; S1 o( p

4 o( c0 o! k/ LCODE:4 S- k9 S. m4 o2 o  @/ s
: e, Y9 Q/ L, R& K! z6 y1 x
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
$ T6 h1 ]& H: N" N' m9 s/ @+ rLinking..., y# K* M' r2 Z# w5 C
Searching libraries; }1 P& ~! j7 P3 B% Z/ u8 D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
6 }" _4 A& `! ^- Y; X% ]& u. P, a. ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
' q* W3 ]( I: W  uSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
: l' L: M7 @1 x' USearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
# j. ^! E0 q( b8 w/ D- knafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
- i/ c$ w. I; t: BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:) a3 z8 m; V) T( w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
- L& L3 g5 g) m& qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
" \+ @  J$ @& p, [# d' i2 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:  L1 |( l; M0 ]2 ?; t# ]( j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:0 q5 Z8 E% g4 C- W5 H9 o4 P' k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:& W& [7 Y+ a0 N8 U5 A) B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
/ P" _4 L7 c5 a, I* M$ B: ?' xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:+ @- C+ q) n3 C* w) x) [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:; z9 j" f1 j# r( J7 @# j9 h$ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
% n3 J* l8 V7 D9 w, H- y! K1 Q% aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" ]/ x, v1 x1 Z1 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:/ l9 H) Y4 B: f+ C( i' I7 ~6 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
, x& \' j- g" F8 N+ USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:0 s3 }+ }, \! d/ s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
4 p7 N) ], t. M- }( d- B% sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
% v8 u- [, H3 A/ I: ?$ a; g  Z2 ]0 r! HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:: Y# e8 Y0 R4 C% f6 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:2 ~0 C, l- h$ I5 I& m9 E1 M: i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:8 x6 {% i& x1 R* L( d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
9 E4 X  t0 A5 n5 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:7 w% s# N/ i0 c: G* @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:  j3 L  B5 C& f/ v* v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:1 P5 I" c/ B# U5 V0 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 }! U: g6 x! u/ D* q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:6 d7 B7 k1 ?2 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:, I  c- }/ ~0 A3 l6 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
0 ?- \  m0 p8 h# T1 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:- }0 C) E& B3 W* k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:& W3 f9 U7 F, z! c, Q& B6 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:! r8 p3 [. ~8 M- w# \7 y8 R% ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:8 e- Z" X* W  m+ b, \- Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
" j& I9 B2 r2 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
/ q; E8 g0 u; MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
# G% c, Y5 ~0 k' ~! m' P7 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
4 I% d) V# p1 ]# L/ D  ?; ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
- d6 g  `; y& f8 y! TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:: b* s! H  M( c0 x- J  s% t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
9 ?: ^! s5 X! A& L# C4 m/ fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
1 Q; S& h/ i3 y2 o( FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
1 P# g) S! I( o" U& [7 M2 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
9 H3 V( A; I# M" x- M& OSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:5 {/ o$ N( s$ _7 z5 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
9 q& P' N2 F9 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
! M6 c/ m  x% M% x3 a7 D* pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
- v5 i6 N3 Z* a/ D3 h  V5 J6 jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:6 a" r! c1 S8 J+ F* I* M2 h# Y+ [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:; _3 @7 `$ G+ c  b$ b* w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:$ b$ t0 O: `5 G9 G! t, g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:2 y$ f3 ^* u" R8 j$ g7 w9 k1 Z% R
Finished searching libraries
4 G/ [1 _  V. aSearching libraries
2 _. ?4 l: P, ]5 e! CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:$ |2 B" n5 P1 ^/ g9 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:) A0 _! X: i! A% Q" [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 U& V5 [4 x% ^  uSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:. g* F$ ~# d2 F" }- `! g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:4 U( J: |7 Z* n. c8 Z! @9 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
; a* @3 K$ c' qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:2 G+ D0 X5 F& }( s$ W+ F" B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
% e! m0 P6 J3 ~6 R* l1 j# g/ GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
+ J) Q' z2 d/ t" ~  iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
! z4 j/ T8 Q: k3 H! s& rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
$ m) y) m- I* e8 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:/ a7 X1 R; ^6 ?7 d$ j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
4 V' x$ Z. T5 a+ x. I( WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
  f! Z2 F  I5 T  X7 A0 TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
( m2 ?0 Z% o1 n! ~. `' GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
' v# T. ~* }- ~$ l0 z* D% P: _8 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:. c6 l$ n5 d: D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:; |, @4 Z6 K$ w7 l' b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:( D. g- M7 p6 W  \6 W, K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
9 K$ @% Y. l  `9 w0 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
+ n2 S$ E; I: aSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
2 \& n* h* J1 V- G( E8 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
( k3 g9 z9 M. h# _1 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: j4 `& W! c& U$ E! y5 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:% E' k& o  R! {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:. [6 Y, @: d0 ]: Z" h/ Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
( G2 L$ k% ~9 d! R3 |: ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:: @, |9 f* F3 c8 t6 M- W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:; w+ c* V) ]8 W- M& K
Finished searching libraries. u* q& Y! n: K5 L# J- `6 g8 y
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found/ u9 n- j, p7 t# A
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
) _1 E5 ]* P  b1 I! P5 ?1 C9 z9 c$ ZPerfMonDemo - 2 error(s), 0 warning(s)6 A& M9 p' f, ?/ L! C3 v( a
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
! U1 X  y+ i2 {, D% H- E) K# V- Y, ~2 f- T
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
8 _. g9 c" G7 q  `8 b解决方法如下:3 v5 o$ L$ m9 W& K9 x
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
& D  e( O! b* `3 K加入/ ]5 i! r5 O5 h# a$ K/ C! E* T
nafxcw.lib
; H5 {6 Z, T4 }' n4 ]( Qlibcpmt.lib
! l  k7 k% d; W1 w4 {Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
2 x' `$ h3 a1 d加入
7 H! K5 f& b* F/ t: |  @nafxcw.lib
& T3 }* u) e- ~+ i1 vlibcpmt.lib# G: x6 g& n/ R% z. O& K2 Y, V
* ]8 b3 u! u8 [6 {4 Z
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
# @2 O( M8 P/ i& F" J1 C5 w4 i, E: i0 q$ Z
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 8 ?3 A' s# {9 g* q% P4 E
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ; \/ r4 e: t/ R# Q) S. s' s# d$ V
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
& g3 K. X: n+ D+ }: V! r1 M/ K" W调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
& S) a: y8 p. E! m# Z' d$ ~调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
8 N/ p2 H' y9 N) ^8 M使用 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++ 程序集安装为共享的并行程序集。# _. C/ C$ Y$ p& z% E
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,: D% [4 s! d8 Y7 q4 w8 U  _
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。; A- O% T3 x7 J& _. l
楼主的方法容易误导初学者" Y. t' \- t# b7 H

- B, c7 r/ q4 A; l: i( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 10:10 , Processed in 0.020411 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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