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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
% P4 b; I9 T9 n# @  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。! D! c) e$ E& O) D. o
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:- |3 C# G5 S6 |5 u6 J  {$ I
Project-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library5 ~  t; d# w, a: Q. m
6 r) M4 P$ `. z+ |5 p  r
修改成Multi-threaded (/MT)
+ Q2 T4 m" r! n" |
- e. u4 f5 W' b' v修改了Runtime类型以后8 j; N( R+ F5 A$ e$ J% ^" y9 F
: F' x1 d6 X. A
需要将MFC的编译类型也改成静态库:
& C( t( t1 j- b2 r9 ?Project-&gtroperty->configuration Properties->General->Use of MFC( E( X+ ]( d9 m; z$ b! c
修改成Use MFC in a Static Library  h8 z+ g( w% s! D- L) b/ L/ {

$ e$ J9 ^4 S9 o" L一部分情况下在这步就能解决问题6 T2 s* ?4 n2 ~& I7 A1 |7 H9 {
另外一部分情况会遇见如下情况
2 f4 _$ F/ ~6 w8 G6 r4 C* e7 o; [/ V2 p7 z
编译器报错:% i/ M' b$ S5 T

6 a# X- C2 D) q, T" |: gCODE:. Z, U* s" k" M/ O' L, |8 D
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
7 a$ @; H1 j+ A: r# \5 W; K* Z( Q$ g+ p$ D6 }; k6 Z
产生这个问题的原因是库依赖关系:5 Z& T" X8 k; N. Z6 U( q8 F' f* B$ ~( u
在Project-&gtroperty->configuration Properties->Linker->Command Line
8 k$ p$ N% w5 a$ r2 S9 S7 D加入编译开关/verbose:lib可以显示详细的库链接顺序
. C' ^2 s$ L0 E" ]6 `# V6 Z* Z% g7 V, \+ I6 l+ f
CODE:" T- O- A# H* y- a7 O
6 m- p: _$ z* K  p
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
0 h8 R" z, D" m$ d- z8 C& q9 iLinking...& w( i" ]& i# S0 c5 i. z  g4 Q
Searching libraries/ D; `9 I5 X0 \3 e( G3 s6 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
( T3 D# I4 t- }' D1 F4 C5 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:3 J! {# ~. U; F. W) t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 ?8 s: E7 M! }! ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
  Y1 x* m6 i+ T/ ynafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj). _! h6 x. B3 O3 o+ q7 d; C& }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( ?, S( M- x! i5 s7 g3 K$ p3 D% U7 T
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:3 |4 ?) @: I' g; y" D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:# p+ T' R' ?* O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
* e- K3 J( F- ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
4 P" z* _2 S1 B; D0 h+ ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
4 P1 g" l7 {  s- M1 ^6 P2 W( YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:; v" {! {$ j- z) [- B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
4 `8 e" \7 C  y: J6 _: r3 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:" H6 m) `! b8 ~' e& }* W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:( E& c7 I; y5 N9 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:; m2 o9 U$ H, c  A5 a) P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:2 m9 V* ^) Y8 s. V! s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:6 r0 q* B5 i4 M' W( u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
' b) t0 v: t: S& h+ Z4 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:) i, V0 Y9 S- U  w. g3 S( U
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
) i9 |0 V9 o  e: E& a" w% kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:( y% U9 Y( r/ g0 J. m, P% M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
9 B( m: p( z7 _5 l3 f" w  nSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:5 H% g+ t! J9 X3 {( T1 z% H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:! O1 r# F  q! E# q. Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
. l# t+ x% P# U4 A! iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
9 c3 n2 h% [3 C4 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
, N& ^8 ^' X# `! F' sSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
/ }5 A: x. a2 {8 v6 u5 V3 JSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
, E. u/ j8 Z) ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:( o+ u8 C- K9 u/ S+ v, f5 a9 O8 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 `3 R6 s9 c/ Y" bSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:4 D' Y5 s5 c; {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
& w3 ], z5 r0 z5 x8 A$ M4 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:# a. u7 m" R, t& A0 k9 N' t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:$ V  H0 W: L* {8 B- ?7 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
* F. n& n: L' Y) F1 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:! ?% [5 o5 ^0 u& {9 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:" X# j7 T' F% m3 S; w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
7 X0 O4 X- B8 y) s8 Q: gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:7 l' _: E% x* n9 T  t+ S" z- Q, D4 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
: t, }) j+ m9 x4 b$ V: eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
' e" F7 a8 h3 r/ jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:5 R" Q+ x- S5 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:( H9 N' ~/ W& F3 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:. E5 i+ {0 h/ J2 R2 ~: q% {4 w& a. J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
" m  m6 r$ m2 U* e& o3 Q5 J$ sSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
+ ?0 b$ v8 X5 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:. T( q  `- i% t4 F  `+ t3 D, g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 \8 \7 I  q& K0 j$ n& ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
& N7 ^, ?+ j" SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
; F) `& g0 J: T. [' ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:. T; p+ z3 d+ A4 q( t5 p/ ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:: D" o* T3 m- t& v4 L. Y
Finished searching libraries, [5 W" m% Z/ {  x* `
Searching libraries% _4 s  r) t* a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:3 F. t. W9 s- N/ t8 A- f7 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 I/ A# ?7 @8 n/ n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:1 X, Y  z! |. f# m/ m" B- O$ w0 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:% n( B( a* X. ^" r7 u9 T: d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:# G# l! t' m8 ~, P; Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 S& F1 m! }0 ^3 [( ]% KSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
" \/ u; C7 n, a. p  Y0 X6 z: sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:: N  J0 I1 q( m+ D9 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
0 u' W* x& t5 |( w6 H$ ?% CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:& c/ X% `' ]# x: m" b0 y4 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
8 }( U2 ^: h, G. @8 d' q  }2 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:& {" j, w& O! k8 L1 F3 F) w' S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:6 o$ N1 [& Q9 i8 b. j* }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:" J( E. x! w3 J- d9 K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
3 D6 T  u/ A  \9 b& jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
' E6 R1 `1 }) t) Q3 ]8 ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:# V5 l, V1 S; A5 [, T/ F) I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
; W+ T: H( u3 J- P' x* F; cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
6 I6 N8 x3 x. g7 ?. H7 W6 fSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
  S& M8 ~/ p0 D1 rSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:* _) @- ]9 s  d1 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:) [( |, y/ M7 I/ |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:4 q. c' P/ Q  H5 m7 l5 s8 G
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:4 w! P* y9 ]/ u) z% k% |2 I
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:/ x! B9 @, D+ B" k! c; S8 ?& N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:) L6 m9 \+ N0 U, E+ j( z7 ~0 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
6 w4 U: u0 A* R7 @' J" _Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
4 k+ c) x8 e' CSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
' f6 d1 T% o+ A1 M7 v8 JFinished searching libraries3 p4 s+ t* R7 i) ~8 b' ?. B, W1 I4 O
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
7 N% d$ ^8 \& U4 g' mBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
, N3 ?8 s2 z5 x+ @4 N9 fPerfMonDemo - 2 error(s), 0 warning(s)
4 w/ I9 E" ~( D, T========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
) c) I5 c1 h/ ?" T( u/ R, M, x5 y: D" ?2 J* m  Z5 x* T5 J! E
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。  a0 u6 V# I' r3 Y
解决方法如下:
2 U( o8 C. S5 j9 l# m0 N: f& r; RProject->Property->configuration Properties->Linker->Input->Additional Dependencies: K- J3 K: Z2 i: J/ P$ b
加入& N8 ^0 H5 c2 N
nafxcw.lib
; |/ e  U4 T7 _% Dlibcpmt.lib$ D! m/ _$ V8 k
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
0 v2 z5 U. d$ S- `加入
% h, N. c! y9 B1 d$ D* Lnafxcw.lib
) u/ _2 o9 V. ~4 q* Wlibcpmt.lib
# C( f( e8 s2 J! ^
, G# F, ~6 v, j  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:# ^; y5 j2 @" b3 Z8 @! L$ R* ]4 U1 W
8 G# p. d( d! u7 H- a+ V2 W  W
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib " \5 p: c7 q2 a0 \( r* g
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 3 R" a* B9 v. D$ G8 w4 W4 o, P
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
3 I0 b# c; l- ]调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib : P8 m1 M; s5 T$ ^' K
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
( G* c7 {. Y+ [+ K' 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++ 程序集安装为共享的并行程序集。; @$ |; O' R, R0 E6 P) O5 v" z
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,6 ]9 e' `! V) P) d% D
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。
) k# E5 z4 I0 y- v- Q楼主的方法容易误导初学者. }3 S9 g/ e! U( |
' q6 O& @0 c: Y7 o2 V5 R
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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