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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:) m- m' k- l. g- t2 A
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。
& F/ H1 }4 M0 M' a1 c  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
% M3 K* `' `) S0 F8 KProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
+ Y: o- v" j3 C2 e" [
' T8 C! m+ w$ w修改成Multi-threaded (/MT)
' v. R% O- J/ H8 H, T( X1 L+ f3 N1 Z( K  ]3 ]5 c6 O5 b. V  q5 J
修改了Runtime类型以后
: v0 f9 S$ k% z/ T( m6 v$ _) P1 U( n8 x* D3 Z% P
需要将MFC的编译类型也改成静态库:% y' t/ Q2 ~/ F' V' J9 X2 j
Project-&gtroperty->configuration Properties->General->Use of MFC! k2 [6 E. g( B# T  E
修改成Use MFC in a Static Library5 y8 h) n- b1 z3 `* S5 W0 B
8 p8 ^- N/ I% W& ?* R7 @
一部分情况下在这步就能解决问题% @/ l2 D  M* L3 F; a2 j* e
另外一部分情况会遇见如下情况3 z8 k1 |5 Q( V+ e4 j7 p

8 x" `+ m9 {3 V: z编译器报错:1 }: L5 t1 N% c! L2 V7 @

, D# p8 I; ^, P+ p& v' Y+ v' x/ vCODE:
9 g+ @3 x  h& \7 S8 jnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
9 s6 {, D% {7 }. j( z1 R' G! e0 Y4 D; D, x! i- [5 y. I) z; y
产生这个问题的原因是库依赖关系:
8 J, H2 G1 A. ~0 O/ c4 t在Project-&gtroperty->configuration Properties->Linker->Command Line
$ A$ P9 C! ^; o* a% K+ j, a2 C4 k加入编译开关/verbose:lib可以显示详细的库链接顺序
- R9 g. X+ j# u8 z( C7 d' P: `1 F
1 A5 R4 r% D9 I" B) s6 w- cCODE:6 [: e. ?0 |- p+ `; K
' f1 U. V- {$ v7 P6 J
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
, v3 ~" X5 ^- \7 ^Linking...
3 V; e% l7 J7 `3 d5 aSearching libraries- W% W1 ^% U/ ?- |+ e" G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- _% m. p. U! T0 E* RSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* ^8 ^" S  o1 r: e$ [( n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:" U  m$ w& Z: u) m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- a9 m+ v( ^; e! W- c, B
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)  y1 G" I  Z. A8 F  n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
" ~, R4 R/ o. l  N/ ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:: ~  m, z; D/ P( b4 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:/ g1 }( _4 v$ d7 ?& U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& e1 c9 w7 c% b& L0 ^9 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:! F: b' L6 M) W' W6 d( I9 X2 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:& H3 D7 R  E! h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:' U0 K7 r6 U/ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
0 R9 E) c$ Q1 t, L# dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
0 O9 U" m, d; z- e2 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:' `1 C2 q9 ?6 Y3 Z! q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:% R, H+ S3 H, a6 g/ `+ [3 j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:9 N& Q5 B% V4 x9 [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* {' q2 o7 M7 |8 |1 q' H+ e% W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:7 z; r- f6 ?; ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
; o% p9 R0 F- ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
- i6 k- i% b3 R' K* ]  K5 lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:1 e  q2 @  t$ }) G: G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:, W4 I9 i" j. b$ C8 s; y' y3 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 L# X3 D- i7 A+ B0 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:: b) a; s  l0 F3 ~& t- s9 Y; H. _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
3 y, @4 `6 C. b' ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; R8 k4 ]7 K8 e+ BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:9 k4 k" O7 W, m% W- d7 \- R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:; ^5 k5 ~( g; D/ B% q' i6 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:+ F% J: B( g4 x7 O1 w% O, S  Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:$ y0 c7 z  j* v/ d5 _) ~5 E: V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
0 ~0 q7 ?9 K, a- jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
& I, {- N1 [0 |* B9 x/ _) z3 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:/ f2 a2 q% F- H/ Q* S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
3 d  {9 X4 F$ q8 X9 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:( e! |, e: Y# l. K1 }% `, [3 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
/ L8 [3 X" @" \% s% i* x' SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:. H5 U: }$ k3 }2 |" F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:+ n5 @/ f5 r2 _& C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
: A* x% R; n+ ^8 N6 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
  B. j; N5 i2 S' H* f& s, A/ L$ a; GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
4 y5 d6 }! Y, v+ b1 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:7 @6 ]. u. W/ J4 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:1 Y, T5 }0 Y5 v, `* J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:* k& C  ?7 T) h7 p/ m5 g  K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:7 Q" A  q) D  n% r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:# L4 g# \! y# s" T& U2 c! N0 Y, a8 c0 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
. a8 }, s2 x$ M$ |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:) o0 [4 ^8 n! ?5 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 O4 G* ?7 u+ b8 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
$ g0 f9 D9 ?! VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:0 p: J" l; y  o' Y5 l( q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
( {; U+ f( f! ?- Q1 B$ ?) V" GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:- a0 y/ d; I7 Z9 C
Finished searching libraries
9 \4 b! ?- b: eSearching libraries7 e1 S$ h2 w9 e, H' Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
- t% Y6 l+ ?9 }% P0 A5 eSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:; b% }! o4 v5 A& I% a0 p& B8 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
# K6 z  \8 A3 ~* lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:5 J# k( j7 O/ `0 P& P6 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:+ ?- |, b- U! s8 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:4 z$ f$ e, j- J$ Y) M+ X% T9 z+ o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:) L% ]! J5 W% j6 ]( z  j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:& T6 [( i% k- i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
( f/ z# t8 p* F  b/ l, ~! T7 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
/ V3 F1 U- |8 D, |8 L+ g* rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:2 y5 C  x3 d8 |4 j  d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
1 l2 g% t2 I( z/ y4 x; v9 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
  [( d5 z$ D* Z* XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
* K( K- t% D/ x* q( SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
: `" [  u4 A$ b& o' WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
, E% `! [: E+ H: }# MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
4 V, S: {! y- t" J' ?, r/ Z0 e! o0 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
6 f4 Y5 m" n# s* n% BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
, G" A5 e$ l4 s+ d3 G) U* _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
; W8 ~$ s& W: \0 ?% h, QSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:5 z/ [6 d% v8 H: |( t, n5 t6 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:4 A. K& n1 A( O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
& S# s- ?$ ^3 b, USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:- j2 j: }4 {4 f4 G+ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
- X; l2 j! w) [7 G2 s% _0 ^+ gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
7 ^( y# t( y( x4 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
3 N8 P8 K( s) l1 j. USearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:& M* E! L9 [# F# ^/ u/ l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
8 K  W  M, i$ a9 U8 gFinished searching libraries
' _0 U5 S1 t; j" x( D! s7 D0 q" }.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found/ X2 Q/ C. \! @+ e4 R# ^+ ~
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"/ v2 Q! c9 m6 t, \
PerfMonDemo - 2 error(s), 0 warning(s)9 w; x8 d4 o3 _3 O5 r- k  L+ B
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========3 E5 C3 o: l8 e1 S) H1 z. u
0 ~6 l/ f' c* g# M% n# q
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。( q3 \5 ]* q) a, D7 X/ y
解决方法如下:
# c6 L; \- j3 D+ J. D0 YProject->Property->configuration Properties->Linker->Input->Additional Dependencies6 r  |+ _$ m5 g9 O* q9 l
加入$ t  F4 r- f' `- `) |" e
nafxcw.lib5 z% E5 G( e+ o  n" b+ M
libcpmt.lib4 g* L& \. N( \  Y: B. y6 {
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library" Z0 v% U" y8 M7 W  d1 q
加入6 B. l% v; b" X+ X# `- X: C- h5 d' _9 u) w
nafxcw.lib
1 _: d. H2 v1 xlibcpmt.lib& N# }7 b1 {/ `2 O9 U4 x0 b
3 P/ u1 U% Z1 R
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:* a1 `, d' M/ U8 Q+ C) g

( X( K/ d7 t/ ?! B  I6 C单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " S" L; M8 j" Y$ |" D
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
: I+ d# T  s' |# a3 b使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ) G/ {9 P7 o; w' C' {0 ?( V7 L6 x
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
5 Q8 a. `9 d9 a* W/ ]调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib . [% W& u8 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++ 程序集安装为共享的并行程序集。- w; X7 e3 v3 d8 v$ H
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,7 a' O5 B) b3 d% a& R
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。
7 P! N! }4 o: C1 d2 Y8 t. Y楼主的方法容易误导初学者
/ h3 H5 l9 B4 T8 X) m# y) l+ X! N1 ?- \+ y: f$ m
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-14 00:53 , Processed in 0.021047 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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