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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:
$ h% H& H4 ~4 c$ k, W  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。8 z, w# ^7 ]. m/ S4 ]
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
6 w# M4 K( K6 o* M( kProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library
% T+ g' i* H5 a2 ?( \9 z, i8 q5 z5 m2 @8 s8 @8 A3 p
修改成Multi-threaded (/MT)( S+ F  A: g. g: \# [2 r- p
& z/ W0 M$ D; ^4 d; _
修改了Runtime类型以后- S4 Y) C1 |7 q: U
6 v/ i6 c) X* n% j! d
需要将MFC的编译类型也改成静态库:; u" Z$ e9 i& U( v( c" m. |3 s- l
Project-&gtroperty->configuration Properties->General->Use of MFC+ Q0 ?% s+ r! X" f1 l
修改成Use MFC in a Static Library2 k' P# Z# Z! [) U8 O
5 j7 @  e7 u$ m7 G  {
一部分情况下在这步就能解决问题
7 ~! A5 L" a' }! o另外一部分情况会遇见如下情况# t7 A2 O; n8 z6 b( x1 m  y) s" B
+ u( |/ R' n; [% L" _/ A7 V) |& L
编译器报错:
" L& `0 w7 A' Q8 J; z9 Y- W+ ^5 ~  o+ Y/ [' m
CODE:% t& c0 V. m: ^2 S1 W! q
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj), U) Q& [# s7 l% @4 f

( A# W7 |. z4 Y  T/ y/ l& ~, Q产生这个问题的原因是库依赖关系:' }) o% ?2 [1 J
在Project-&gtroperty->configuration Properties->Linker->Command Line
$ W9 g3 W/ w! S0 |) |9 N加入编译开关/verbose:lib可以显示详细的库链接顺序  L1 ?$ [3 N, h$ R
5 E4 N. p9 ]9 T7 z
CODE:6 k  P+ J1 I$ d; i* w

; U0 y) D6 j9 o+ P- x8 c* m------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
; ~4 J5 d! D& A6 k! m* iLinking...7 c' |9 n, F! \
Searching libraries
9 j5 b0 e3 Y: v4 {4 p* eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
: K& }# \4 m! g+ kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
0 ^0 ]5 P! X* d9 [2 {, [# A) |Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
& z4 e; Y5 j! i- KSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
5 c. k* I  y! Y  m: xnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
$ t1 n  ?( _! s3 qSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
* d4 _- p/ V1 w5 A# CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
1 E6 M' x: Z, Z! x8 XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
1 b& G: }: A  q0 g( v$ o& SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
: z/ `8 `6 [. E1 Q; x; M% dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
6 r. u& C2 F4 H$ t3 b* D# ISearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:4 \$ z: Z* {% v  ?! y8 L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
7 Q1 b" e) O8 [0 l0 U5 {! NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:+ K3 T* Z, s+ T# \1 B9 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
* B& Z1 P) t& @9 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
6 J+ h8 v* y2 S/ V9 z  g- YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:2 u5 C) p; _) g  S
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:$ l! j' a9 p' i; m. Z% v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:# F, y% h% m' I9 ?! ?) j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
, f% y7 l& g# s7 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
5 u" r7 i+ r) O: b6 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:: S) ~; q0 \0 h5 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:. N8 L7 i, h; @3 G1 Z5 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
' }+ ?, n- C! |) D0 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
+ _1 @0 ~! h* K' y/ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
* w" t3 S: w$ ?6 X* j4 SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:' n& s6 i( d; U; D9 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
& e1 P2 S4 J2 D* S8 m* k, q6 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
4 b: D2 G4 R8 n% VSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
! l' E1 w0 [% ISearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:4 a, ?! j( J, t8 r& `* h6 J7 s6 M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
8 p3 A1 R5 r4 T* f: o  t5 K8 |Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
4 S! C% _- J6 u* V  J  t# QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
6 I7 E' @# A+ E& i7 F# f8 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
! t6 H; B7 s% l# ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
  e* I3 c, L- Y) ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:2 ]$ Y0 L; b; ^; y4 t* \$ x  X1 h) V6 V
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
1 l. e- I" Y; J! [3 c7 u- \2 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:7 x# ^5 p- a- S% \0 e' y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:2 r5 l2 J5 u6 _8 R  T0 a- X% e  {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
3 n7 T7 @0 N# d. t1 c, Z% t0 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
8 }" y) {. p+ E" R* _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
& B7 R: A' ~7 W$ P9 VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:) @& D( |& T+ s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
4 b& d; h8 q, M& L5 S% uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:' |3 m* `; s) W$ l( b1 S, F( W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:5 K! T6 P  J4 k6 C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:% \/ c( X& o: u2 F* r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
5 n5 f- p4 J: V5 a4 kSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:1 {4 R9 U3 I7 P9 ^$ X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:2 K2 l+ [+ U& n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:7 v# `. ^1 H' M1 Z! |) S% {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
( w% K- s7 @4 a/ dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
2 Z4 W/ z+ U/ N' G& ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:+ d" g: R+ P0 ?; n& u
Finished searching libraries
9 ]3 u0 I) J- ]  F" s4 _% g( m7 PSearching libraries) e/ L# o+ N/ c9 H- }; i5 a/ A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
7 d) X$ r( S9 ?6 R: O9 T- JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
) \9 `+ k! N, Y1 h! `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
+ l( j2 S& G0 ?5 V6 }Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:, C3 [, Z8 P4 u" R' L& W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
1 w$ n# q* F9 a2 D: p$ j9 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:% y% c/ m- O1 s5 p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:8 W# E7 y: u3 N& \/ h) Q; [8 q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
! e+ U* f1 y8 ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:1 q* c$ ^  |7 h! ^* F; K, X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
, P8 D2 z  j8 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:: ?) r$ I: [0 S7 I9 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
8 e' h) M( f) `8 L& @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:, G2 }0 V4 g5 u7 s, ]2 B' s1 Q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
' X/ ~! I* ?" Z: N! V& b& PSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:# Q/ |8 q8 x6 L- S" U$ D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:+ |3 j5 h. [# D6 K+ r# r& W" h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
7 a) M. T! o1 K8 d- RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
/ Q7 `" G% d  e0 d+ ]: V. S1 NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:; D% k: t9 q& a8 X( _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:: J- [( T9 }5 m, F  G4 B( l) l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:  d9 H7 @( I2 ^, [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
* O5 t9 l& o- w' qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
& z7 T2 e9 V5 T& ?& O8 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:" @2 f! p4 b% C8 `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:6 m9 p2 X: K8 y$ o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
/ Q6 M* @$ z# o! y" {# ~( J7 ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
  B7 Y( W7 B! `6 q# \  D% w4 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
7 E( P) V( ~/ r7 j1 A1 e; lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:" y% u" s' n+ U' x3 l! X! t
Finished searching libraries
: ^5 U* G% q% }9 ?! P.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
- A' }- u+ t, i" eBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"/ y% \3 [) p7 A
PerfMonDemo - 2 error(s), 0 warning(s)7 S; I  T5 L- G
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========$ U5 q% z( E$ e6 [
' G* h+ }( ?8 U, N
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。4 G' c  U- Y- C9 r
解决方法如下:
3 q2 f3 F2 f. I% tProject->Property->configuration Properties->Linker->Input->Additional Dependencies0 ]+ H7 K7 F% G: s: Z( [
加入
5 X0 V# z( I; v4 o% h# P9 |* |) M  inafxcw.lib0 \8 W3 K7 Z$ d/ P6 E; P* i; ^. {
libcpmt.lib
- J0 l& G' x/ Q* wProject->Property->configuration Properties->Linker->Input->Ignore Specific Library
  D5 Q& ^: x! A1 ~% E8 R加入- {6 m5 J9 U5 z4 J4 V  V
nafxcw.lib5 d  l% R' Z9 w
libcpmt.lib( T2 f* K' ?! g4 |; e4 _

9 y' ^: Q/ c. T2 @9 G+ b  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:& \! ?1 A0 v* \% E; ?
! e5 f/ V+ Q% }: @/ v$ a: ]4 _
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 4 }; j% k" f, s8 v) M% Z
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" {) o$ t* w, _+ ?1 \使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
2 ^$ u4 G/ O9 u, g+ }0 ~0 w调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
& u7 |; h" t# h$ ?调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
7 ^+ N1 o; R. D5 h+ k* e4 h使用 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++ 程序集安装为共享的并行程序集。
  d' @$ b8 X. g" H! j或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,; u9 \1 [, d- a! a" S
就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。
0 F) s! q! i1 V& |楼主的方法容易误导初学者
" ~: p, w8 T0 E9 W+ Q7 }( _9 p6 ?5 Q3 ~$ j. h6 P
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 22:44 , Processed in 0.020112 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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