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

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

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

; w- B1 a  M: V5 l" L修改成Multi-threaded (/MT)" M3 K8 J/ g  B( k- Z/ `3 m

1 `% ?4 B( m0 ]. B* |0 E修改了Runtime类型以后; p8 W+ T: R4 _' E* a2 G

# F5 \8 ~+ S; c6 k# Y需要将MFC的编译类型也改成静态库:
+ N! ?6 h; u- s1 `' Z- CProject-&gtroperty->configuration Properties->General->Use of MFC* a/ l4 k5 o0 V- Z6 M' O
修改成Use MFC in a Static Library
. X& J* n6 j; V4 w1 S9 V6 f8 f) X4 X+ B1 a" `! Y1 D6 J9 A* p
一部分情况下在这步就能解决问题
/ L% J; j, |+ O  X+ f0 }' l$ Y另外一部分情况会遇见如下情况9 O$ \( q' H, X4 A8 K0 Q

/ t" b9 S' a& r5 u4 N6 w编译器报错:
* U6 b! |) s) m; @4 c9 P0 o
: C; k) e5 [% {9 uCODE:( r  m- i* ?* O7 x9 N' d
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)( P/ Z- h8 b2 |, e' X
1 l! Q7 y! U# x1 r% A- @6 Z
产生这个问题的原因是库依赖关系:. \0 \4 @+ f- Y9 u
在Project-&gtroperty->configuration Properties->Linker->Command Line
5 g  e8 H- g; W! w* w  d加入编译开关/verbose:lib可以显示详细的库链接顺序
8 a& L: [, D5 `' a" i
9 M3 C8 D; d* ]* ~CODE:
( ~4 X* _% `/ S2 E, V
$ r% S7 ~: O# b) B------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
; z! T, z2 y2 Q8 Y6 LLinking...# O$ Y. S1 \1 a" R- u
Searching libraries7 \; a9 c/ p1 s0 b# n2 d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:/ O, x, U; O, V7 }1 y* t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:  e% f9 b( O3 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( B$ \& b/ y1 I  q6 USearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
) X- E0 |3 o2 G& |3 T) N# B' onafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)# X2 L  _  L2 l+ I' N4 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
+ ^8 j, K; ]* l' LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
, M% }+ T, h0 G4 p" D* C5 }& {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
3 f. [! Q- I( sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:$ F5 p$ e' m4 v7 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:( T) A" {- m  g$ H# q% S, p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
7 S2 y$ S* s: U3 u/ y+ E9 f9 X5 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
1 Y# W% z8 Z+ R0 d$ G) p/ b* GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
3 h& H5 w- O) Z/ QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
: g6 t/ V9 U5 p; h% USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
- ]3 z% O1 V# d4 Y1 ^3 u( O; QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:" Y( W" z1 p* K3 j% v0 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:9 `0 v! \3 [. o/ R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
# U7 T7 \9 \, r! LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
- P4 n* A8 q6 ?! K# ?( q: J. I5 N* E; tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:" p4 I6 O  C; \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:! F% n. x, j' X, h6 @) V. x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:8 U! X8 G5 g  X+ c" u* B( i9 r: h1 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:; U# \/ B& c/ W. c# D8 I+ y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
  K$ u# d1 H0 K2 N9 n8 V; _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
  k; E% E. j6 {" ~% G# M" J" x* ~4 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
. D/ O, `+ p" u$ \2 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:2 R! d0 W, U' m( d0 Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 d  T2 w0 c3 {9 i: z8 L: v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
2 y5 n* J; B2 S& O$ wSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
  a2 ^+ V; }, A; ~2 E( Q  dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( ?8 P( s( l7 }0 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:  h8 p4 }1 f4 O7 b: F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
2 o% z  m3 y% I/ SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
' i9 F! E1 I  N, A$ tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:7 ?% b2 l) f: G- G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
. Z& f8 }, J1 ]: Z2 R( P: VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
% m2 u( |4 Q& i6 U) USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:9 Z# e* X3 D  r, `% B: g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:+ I- Z  V& p2 ^( X, L( S) G7 B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:7 H7 x$ }& S) X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:; J+ K4 l; E9 x: k: I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:- `, z* F1 \0 e. h2 k4 X3 i" q) D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:/ w7 T  p2 @9 B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:& o! w7 ^6 K8 E- i6 b. L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:$ V. k6 @! q+ |! f7 h1 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:) W. f+ n9 }4 c# K/ R1 G8 H  Z: M* E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:2 Z" C+ X" H0 H3 U. S. l, v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:( l3 z) N) j. A* [6 @! Y- Y7 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
: E  k% |9 s3 U. I, f6 P; }+ BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:- T( ], F: }$ ^' |! ?. [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
& E! N- w' B' f( j# {/ b4 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 T. s% V, c9 |6 }; p7 u' M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
% y8 r4 [+ ~' TSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
8 u. E, B0 a3 m4 L6 Q/ @. K" v! DFinished searching libraries0 R- |: v* ^- E+ g( ^
Searching libraries
# N( t2 W% U% d+ ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:: }$ ~% n$ q5 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:. R5 S5 s# `6 x1 v- @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 K! M; o# s5 v0 N  P: |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:+ V( M) N% b* J7 j+ n/ U3 ^6 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:4 e- r7 }, s6 \3 `0 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:4 l" @9 w& Q* a8 J* \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:0 E+ ~( A2 G3 i5 a1 U- s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
9 w  `: p8 Z& dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:0 v" k" X' Q! V$ z0 S! t3 C) t5 e0 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:% a0 k3 }/ N6 e  z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
+ Y0 Q: A% n1 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:+ ~0 r# q+ O. X" r* N0 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:3 n; q4 z; Q8 C2 N- H! K% Y6 g/ K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
" h- Z  p" E3 ?, _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
9 q, \+ W: J# y5 gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
3 ]6 e0 k5 i8 J/ u) j0 O5 M% _6 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* Y- d( R& o/ i+ \- C$ N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:0 O  C; @# _- h% I( @- p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:* ~! i9 `9 n4 M7 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:4 i+ @5 v. l( }+ N1 V) C  [# A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
, g- Q/ |# j3 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:( E- D* V4 O5 q% b1 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:8 @1 g# Q" F! X6 o0 K3 I6 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 C" a( P0 Y& \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
$ @9 I% a6 ^% USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
" w4 A. P* `$ X9 i- [& `& Q1 z$ |0 dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
+ i1 R; A9 ~. j/ P( E% ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:8 W1 G' T% q. l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:! u; s6 P/ _* B& s. h; `& k5 H
Finished searching libraries
: Y. d; c0 K3 F: B. a0 l1 D. {.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
- j. `. q) U% c" i  [3 g9 B. w# bBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
) B, w+ R. l" k( x2 b2 UPerfMonDemo - 2 error(s), 0 warning(s)
( C; W6 j8 X& `! a: }4 ]. [========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========$ E' w- K8 b* f; |* n
. Q; X+ L  z+ i$ i. m; P) K& g( ~5 V
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。% }# [8 R1 O. b. p" V4 a8 ], I
解决方法如下:" ]2 }- G, M# h2 x
Project->Property->configuration Properties->Linker->Input->Additional Dependencies0 M0 ]) V0 ~( T% m$ o4 w* _+ ]
加入
9 r3 d- N$ K! _: |3 o" {9 e, Unafxcw.lib
' I! X9 @+ s2 B2 mlibcpmt.lib
; u% j# n  _: a# z' vProject->Property->configuration Properties->Linker->Input->Ignore Specific Library0 E9 I; w( ^5 s
加入- q* X# I5 _/ ]/ g
nafxcw.lib
7 |6 H; P3 c! v# @3 g+ j+ Zlibcpmt.lib
2 F' K$ u6 h: t2 {  Q% D7 e/ R$ I1 y6 y. E3 m& j7 Z. ]
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:% I9 Y6 d' ~7 E! i8 d4 u- \

6 e" [6 g/ I! t  ?6 p( y单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ; ^: L5 [. G& x
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib & r! G! {# s, _8 s
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
, |6 X6 c; d4 v0 i- A7 D9 }# V( O0 j+ B调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib   y& r3 h# C/ T! x7 {
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
" S' f% ~4 ?; `使用 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++ 程序集安装为共享的并行程序集。3 c9 C/ J+ G( j% H' \9 S
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,# c/ x3 i5 ]; A0 f* m
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。2 U3 k& }% M$ x1 |9 ^. h
楼主的方法容易误导初学者! e! v; I5 Q$ N

( h* {' L* m6 e( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 10:24 , Processed in 0.018871 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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