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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:  O, q5 m% X1 D: s
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。, C5 V& V' q8 [+ U
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
, X; i6 ]7 u' t& g0 o( X9 D' OProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
- F: R" {+ f# W% D6 K( B
2 M0 ]' }3 s, h1 i8 N修改成Multi-threaded (/MT)
% D. c# k1 j( U( [, E0 a
' ?' ~% R+ z  a$ v" w修改了Runtime类型以后
, V- p4 D0 c1 F& V. q5 i
  m$ v, s4 v# v1 w. j8 a, y# e需要将MFC的编译类型也改成静态库:: e. m& k1 H# `0 ^' m
Project-&gtroperty->configuration Properties->General->Use of MFC; x8 ~8 v& z- T
修改成Use MFC in a Static Library
. q4 N  p6 o) {' q& v" C$ M0 k4 c$ Q4 S# u  U1 M8 E# K% n
一部分情况下在这步就能解决问题& Q6 A& T2 f- J" v' P
另外一部分情况会遇见如下情况
# ~8 o0 S; A  ?: B+ F: V2 _9 W/ @# c* @' ]
编译器报错:
. X% ~- e6 z4 U& s$ x
5 B6 t4 \3 _! [2 bCODE:3 q0 P# E5 ]5 t# b* ^$ D: T8 W4 b
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)6 J4 _7 Y) u/ z6 j5 X% @

6 d% u; n& Z# |% B产生这个问题的原因是库依赖关系:8 G0 C4 g& Y7 @7 x
在Project-&gtroperty->configuration Properties->Linker->Command Line: {" d! V& A' ^& ?
加入编译开关/verbose:lib可以显示详细的库链接顺序9 Z4 K$ U. K# v
( d) E+ T& x9 v  v+ H
CODE:% O) L- b% w2 t8 U
5 U. C" L4 u' n' I
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
4 V" \) L- r; xLinking...
" F" w; P  U( B1 l  }; g* ASearching libraries) F8 i# R/ }9 A- L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
# Z$ [7 y7 P. d) X+ @Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
* C; F5 i) N5 ]/ A( F. b* D' dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 n+ S, l% M8 ^7 a: @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:. t" r1 i$ K, K$ z/ {
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)0 F9 _1 X" {+ Q( J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
6 L, o/ \0 x, E* _% h0 @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:( l) G* ~. j! l3 U5 ^9 B: q" |7 S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
6 y9 G& p3 T0 t- aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
# |* [, D* Q0 h/ O* O1 O6 KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
# D6 U# w* p/ [$ gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:* D* m) j" L- y% p) h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
' G% j5 u' F5 k0 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
% ^8 u* _6 R. r/ A1 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:  p/ l; ?3 e/ J4 a: ^3 I. Z8 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:8 ^$ ~3 l+ n  ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:. f! U, R" L  u7 \7 W4 J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
! _2 a& g% U& @% XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
/ f' _$ f! ~! d+ s) jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
6 i. d  }- s0 ?5 ?& bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:. M; B. I2 j" c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
) D1 f  |* E) l2 {% _* A( GSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:7 p! ?- X) U+ n# b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:1 u1 ~) T; g5 w$ e3 ?0 d0 p+ z: V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:7 O; j( Z. ~" S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:8 u9 p4 Y& W6 u! \9 u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:, P* h; x8 ?" x( ^0 N' y) K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:; ~2 H3 [! w; R" K/ ]0 N& y+ ^5 i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:1 x+ {& f/ a# g0 `/ ?3 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:. n" J8 \5 u6 s0 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, \& O1 q& _- G+ d) W0 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
7 d0 m4 X  @! G2 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
( c& D3 y5 b5 r' X9 v* i9 PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:; [0 S# H! z1 Y8 m# h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
$ d" r# Y) j: I9 P, P- P) oSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:( A1 F& _! x' C  e7 f# D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
& W% c) h% U4 }( G$ N" z$ C3 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
3 G' O) B7 ^) L8 v& ^$ b/ {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:4 ^& h2 Z  X. P  e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:3 @3 ]' |: O  {$ {! S# x6 `8 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:( |" L* D9 j& i$ b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
: L! {3 `* e5 }- A7 F5 U3 HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:( F. ?' z: f$ p, O$ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:( \6 Q3 I) }' ?! Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
  v7 a' P& m# [  v, K8 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
- d8 `3 D8 e% `/ {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:% O$ A, }* F; a/ R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
1 ?( S; r! C, g8 ?" Z+ H+ RSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:; a: x2 J! ?; Y/ [6 ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
, M. h3 U0 L4 B' ?& k/ R; JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
0 G% _9 p1 C% b2 LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
4 K: R, ~! A3 b  a8 t! ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
/ N8 L7 \5 U  ~/ ~4 h. _; `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
: t. q: k6 ^3 u7 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:* O0 ^, C# s$ B7 C) c
Finished searching libraries
) m" j1 i/ e% c0 H: R0 zSearching libraries
& `4 |* [' f: H1 c  c8 c( |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:) j! H- u* a# N7 A0 N' x: T) V* R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
3 L9 k1 E; r& C7 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
3 {5 V% F! g, a! }Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:, c( O' J" ]* H, h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:0 q$ \" U0 v/ H' K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
% }+ ~1 B9 M& ]4 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:3 R5 ]9 ^# l1 U; A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:8 f* U' a2 K. y2 b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 w  f5 W  O7 ~7 R% WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:9 h# M9 l6 L; c/ i
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:2 l% V& [# R# ?  m/ c; a8 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:2 _5 s" {) x' ^' F1 n7 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
& q$ q  {) K& ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:' ~$ f( _. S- z% V  N" W3 N. O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:' R9 |4 D$ H/ p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:, F0 y2 r! ~! }# T! b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
- ?# |8 G, c0 q3 s3 r& m# CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 n! K7 b1 ^' V0 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:- M. v+ Q  s1 b9 Y' |* F7 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
, ]! n& l6 r+ m. JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:& y, |: a4 y8 E5 h0 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
: m% _9 O  Z& O' ~. {6 f" ^# }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
  i& h5 T9 c- g, Y3 G/ L! _$ HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:3 W5 @2 {5 p: Y7 C$ Y' V$ C- b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
1 m4 _' [7 d( [  f. f0 \0 vSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:! \! f: k/ s5 ^0 s) a/ T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
5 Y- n  D1 l/ H. |: lSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 ?2 H  ]5 M" S6 f- b3 n4 l0 ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
! D1 R  Z1 |: W' t& Z" [) qFinished searching libraries/ O" F% |% J( t3 W7 @  Y9 P
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
7 [' M4 S2 [, r! j; Q9 c: KBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"/ G/ ]2 I7 G! }2 q8 K4 k
PerfMonDemo - 2 error(s), 0 warning(s)% m/ N6 i: s5 F3 r: A: R
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========1 P- @1 v- i+ _/ Y5 |( U

# p4 B3 z+ k1 r" @" V我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。+ e8 j- P4 f6 b) k
解决方法如下:! f  K) t* Z: N0 t# g
Project->Property->configuration Properties->Linker->Input->Additional Dependencies, E. N- a+ M8 g9 L# f
加入( P9 J& M+ Q/ t: J% n2 r' G) N
nafxcw.lib
# Q- N3 B* O+ U8 ulibcpmt.lib
4 T( k0 ]. p5 J2 kProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
3 d( q. J# k& ]' F加入
7 {1 B  M' a& knafxcw.lib
- E- d+ X, J8 ]libcpmt.lib* j7 M7 F( b0 K# t8 n+ {

5 n5 _8 b6 i& o  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:9 J: K0 Z2 l5 @/ p0 s6 I5 t
; U% X0 w$ b9 e7 t" R: t
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " x+ D5 k7 v4 r2 a7 {
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 5 F: E1 i5 J$ d" o( z
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib # x9 \3 x0 X6 c( p+ ^
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
. }+ Y( ?0 ^, M: }' u& ?7 ]( Q调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 7 @/ k! z. |; ~. `  Y
使用 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++ 程序集安装为共享的并行程序集。
8 W% Y+ S. ]3 Q& M或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,8 L0 q1 s7 P8 g4 M) O* k( N4 v
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。9 l" U9 e. c0 e
楼主的方法容易误导初学者
3 \/ h1 c$ d0 a0 L9 `/ G; B
$ Q! u4 V. t. p; y' h. {2 a( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-14 02:08 , Processed in 0.018732 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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