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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
( h5 w# o4 `, u" T/ X' B3 W  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。' n9 I# x1 \+ j/ A1 b( r( J% T( f) }  O
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:/ r- |3 q9 ]( u
Project-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
2 w. h; r5 n) q: z6 Y6 \$ k& b3 O4 p2 O" {' N0 q1 I4 w
修改成Multi-threaded (/MT)
+ v3 e* y% S3 ?7 _8 E7 v. j$ S! r& ?9 |4 r3 M1 u2 }) D
修改了Runtime类型以后* P) N' ^( M0 k5 |- B0 Y+ P

7 [7 \6 \: S3 Z1 l需要将MFC的编译类型也改成静态库:) P& t( w% n% J" P% M- y# g
Project-&gtroperty->configuration Properties->General->Use of MFC
/ R. X% B; e7 [1 l修改成Use MFC in a Static Library4 |3 e7 ?1 @3 P; T. k

9 b  U, f% w$ G' q4 y6 Z' n4 j一部分情况下在这步就能解决问题7 A6 p  q& [, p1 s
另外一部分情况会遇见如下情况3 Y1 l0 f$ K% B# i% p0 ?6 o

. q' v+ i- z* o1 }+ I# [编译器报错:+ d5 F9 D' u+ o# z! L1 D- y
$ r* W5 y* x9 H' g3 f0 T( c" y
CODE:
& w+ {3 r6 n0 e' snafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)) _' q7 Z2 E7 t- T' S/ E# Z
- F  F( H9 M+ D# G/ O. D1 p
产生这个问题的原因是库依赖关系:
# r) M, _6 ^* L& `在Project-&gtroperty->configuration Properties->Linker->Command Line% D$ I. {7 x7 I
加入编译开关/verbose:lib可以显示详细的库链接顺序
3 A  s2 y6 I( s+ j1 z# y0 S6 {6 w) a
CODE:
. m) H) `0 B; W$ r& q1 z" s# j. W
2 |7 M# K8 B$ w/ ^0 D$ Z) Z8 L------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------6 W' R' B6 |, C# G
Linking...
! U6 ]- c, g8 E2 v0 t% NSearching libraries; P) l/ B$ r3 E" @5 X" Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; B3 ]6 Q- u; F8 Q) R5 n# JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:* b# R& E- S7 r3 R2 T* d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
' `- f8 _9 e, q5 R  \5 p- X* f# ~! CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
* Y; \7 D/ d3 vnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)% m& ^+ }1 {$ D; E6 \( [* M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
. S) v1 R. w8 a3 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:( t( t5 Y( I; J9 b- f* q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
- l/ f+ b; [( m" VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
9 u- S; F, R* \, T* oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
4 d. ~3 @4 h; Q2 E, \1 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
6 j" U0 T0 l8 {3 |2 n9 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
! E* B1 @" I& n% E) JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
) p) w, @/ u! u7 I  mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:! P! k; [6 T$ L0 v1 N: d% U; S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
2 ~4 W5 m4 o1 Y" C6 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
! T5 K9 }. D) F/ a6 |$ _' Z; ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:) t+ J6 B0 W) @! s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
3 a) Z8 @! e" e3 f  K* L# g) P' O+ nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:8 Q5 O9 v& ~4 F' y! `* j# v6 d/ F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:3 Z3 c3 o9 K: I$ Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:; m. [( j( B' T; _9 u, c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:8 ?6 a3 M7 c9 I2 p5 b! P" l( z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:: l  @! r4 K, ^& b+ {! d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
. J) _$ c6 d2 [9 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
5 {0 b/ _1 I3 h  OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:% {$ |! a5 W: d4 G" o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
& \" B. c* E* o! ?- a7 k& K2 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
5 q2 o7 G. d% N2 |) o* ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:' q; }7 O* ?+ @9 ]7 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
9 q0 r( e; v; J; nSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
0 k# I& |6 I& ~: v$ k1 S  ?  R" eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:! [: M* Y( P6 L& ?2 D& w" B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
- s" t; k" A8 c6 H3 D) X, |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
% L/ N) e3 p/ u  a! \7 ~; ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:% k% V9 h, C+ N# ]$ e5 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:8 l$ t# t0 }% G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
3 e* S' u( c/ |. U7 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
( f& L/ l% u. u% k" _: g$ lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:+ \2 x4 N  v- T8 R. K) X! B& R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:) L% W6 ]9 L! X3 P$ m$ ]' o7 s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
; O6 H! g4 R; h) [0 l9 ^1 Z  B5 ]+ NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:: R( p# d% G7 N% W, Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
$ K8 Z2 T% g' f6 ~- P% }" DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:7 A- \; ~# A3 ~1 n- z4 R/ U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
4 g' B/ K- H' }' \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
# \. a$ i1 |0 J6 ]& j$ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
: J' ^' \7 C" r/ ]# D2 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# _6 k+ F$ h; r# h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:+ }& L+ X8 ^5 ^$ e8 F( K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:9 s: f3 ~' x. B9 y9 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
' e; [( S4 Y; F" |/ I% M2 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
! U2 M: w$ z1 pSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
9 m9 e. a2 C# Q, a2 J* XSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
  R$ i5 U  y) w- RFinished searching libraries' K0 |: m6 Y, [' s( [
Searching libraries
1 O# ~6 p9 M; R1 A4 I0 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
" b0 w( G3 P# i* c: ?7 W" u! C5 aSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
* n8 ], [; Z2 @3 U3 a$ {Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
% @1 O6 p0 }: e- Y* cSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
( v- _# W( i: o3 v, h/ }Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:6 \; Y& V. ?' E' Y9 u7 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
9 E/ Y7 |0 R+ H8 `* R; o& y' QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:0 B3 h. I1 g2 e: x2 p, ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:4 k; d9 B4 a+ I: D$ p- c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
9 y7 [9 t$ E; f9 R4 {( ~- ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:! K2 `- c# `: `7 G/ }: [: V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:8 L' B- f* u- G9 N4 d5 w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
2 K( t. L1 ~# O- g5 t  rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:! `/ f. E1 N( q- N8 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:+ O( A1 S) ]) s) g, g" u7 u; k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:9 ^  k$ h( Y, J$ H( H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:) B" P1 O, I, W9 g3 X5 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:! k; i, \5 I! n4 z3 l  _. P$ q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:5 X# v1 f, c) g( [: B7 q3 h, M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:; b& y/ g. |. V$ X" A3 u, g  f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:( \- C8 ?( ]# M0 v. F& b1 \8 ]7 a0 d% }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:% u2 Z) o* H- A- \% y/ t) L; w1 v0 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
1 p& G4 o% N0 E" tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:/ k" [& x4 p" a& Z" H. R  l' S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
, J" d& K  a7 K* q. VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
9 N9 X0 t/ h) E* W# ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:+ ]7 O/ O1 b9 }5 {* {7 r& e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% T7 ?9 _; _  h5 M/ V( r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
  `% x$ M# s6 g0 ]2 _. D( cSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
% l. j" @) F) L% YFinished searching libraries
$ c/ ^( P3 `' C, D.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
8 ?/ S. |# }5 H) @" T% tBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
  p$ H; i$ A" S9 {/ U  _2 HPerfMonDemo - 2 error(s), 0 warning(s)( P* y  h& M, {
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
1 e6 h3 A' l  O( M' G! F: G7 u# F" V. A6 Z$ l
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。- x7 m+ r2 C+ D, A7 Q( {
解决方法如下:
2 z0 x# F3 b, L, E2 I  tProject->Property->configuration Properties->Linker->Input->Additional Dependencies) j! s- y7 T( u  O3 _) w7 }% H: N
加入
* b: I# q8 V. t3 A2 nnafxcw.lib2 g/ d+ F) O( n- V
libcpmt.lib
% J, ~* ?+ J9 n" vProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
( h5 ]( l% ~5 \  g加入  d" F2 L' w1 r; i
nafxcw.lib
5 L" w: |/ Y( {8 tlibcpmt.lib5 `$ [. ?5 r* I  O* _- @
4 D+ Z( b( m9 T" V7 s8 E
  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:- A" v/ }1 f- a% `& E. T5 ?, O

. S- C! f9 K0 _5 U  l% s, H' W7 L* C单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib - S! Q  V/ @: r$ {* v  O
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 z( }) c* |# s" v: E
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib : j' B0 i5 ~- J+ a$ l
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 8 f7 [* o2 E- ]  U! p2 X
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
. q1 N. q7 u$ i& |使用 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: t6 W) f1 Q
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
! m: A/ ?! s3 y" ~$ _# a: M' W7 D就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。" \# R; U# Y# u  J
楼主的方法容易误导初学者, h: S9 @+ i# l2 B- ]( L
2 `9 r; q# V8 k! v
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-15 01:41 , Processed in 0.021838 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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