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

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

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

* ]. A7 h1 C8 y5 ~: ?修改成Multi-threaded (/MT)
. e/ P1 B6 M$ U% G$ p) {% ^/ P6 v! q4 g! ~: u# I
修改了Runtime类型以后
' F  u! T: g, t: S
( f3 D7 C+ W* n' ?% T需要将MFC的编译类型也改成静态库:
4 Y' O  G; d: i3 r$ XProject-&gtroperty->configuration Properties->General->Use of MFC/ J# G- o' E$ W; h% T( u9 O
修改成Use MFC in a Static Library
' H4 M3 }/ M5 P1 E, d$ l# d( N" F2 k% c
一部分情况下在这步就能解决问题. z' y9 f7 N8 c
另外一部分情况会遇见如下情况) L' O. V  X2 C* Y: u' n  Z
+ M6 e- l3 z$ f6 G- h  K: V4 [8 H
编译器报错:/ V3 q& e7 T6 [9 Y1 Z

0 _( W% Z$ A' z# VCODE:9 n! M# e* n& B8 K5 r- D: ^) o$ b2 F
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)" C' k- m  O# T4 K) Q

( @$ T9 J* D8 F' ~+ u产生这个问题的原因是库依赖关系:
6 ]7 I- d3 o; u4 d在Project-&gtroperty->configuration Properties->Linker->Command Line' b# w; c, K2 P: N3 i2 A
加入编译开关/verbose:lib可以显示详细的库链接顺序
8 a* [  l" Z# d- G, m: }3 a3 v6 _) h- ~' e+ l, G. B
CODE:
' T2 Y' w5 g9 p% e0 W
7 @1 o! t$ Z& i4 ~------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------9 A, ^) P* i2 o* Z9 n5 s  {3 s$ s
Linking...
. K" p, s) e* C0 f% D2 JSearching libraries# F: B8 f7 z* w
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 _8 S1 L" }# o" g  @9 t9 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
9 q8 N! X/ o6 o4 s# {9 T) D3 u. HSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
3 Q* z% p4 P( f* tSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
3 Z9 D7 s& L  f8 P# Q( J3 lnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)$ l; p( M! \7 ]7 k9 y$ A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:8 z' u' j& R  r+ g1 M/ [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:  r+ C$ A7 S6 i% G5 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
7 r  M" K  U/ {& R, k: GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
/ o/ i: l" S+ W1 }& ]) n7 {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
8 ]- x6 M% e6 r6 |9 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
+ m' ^2 W, R! ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:# R7 m( w8 y' |5 r/ f% g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
& w) W7 j" |& eSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 f' ~* Y7 V' cSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
9 p$ t$ D. x* n- \, Y# iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:* T. a, K6 d- L" i9 @  k$ l, b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:. G6 Q* G2 N) `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
' V$ W# n4 b+ f8 X0 C5 U: J" Q/ YSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
. E! |, s0 s; s4 y3 RSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:: x# n+ u" r: l. C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
1 N# C4 ~' E- K' h) m4 ?2 bSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
  _0 J: j  Q  B' i( i. BSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:7 e, Q' i0 M* g+ R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
: g9 X" x! Q' |8 c3 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:( y2 E% Z2 P5 E# z* @" w" D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
1 b% p/ F! L9 ~; e2 Z, J; [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
2 J0 v: m1 S3 i% |% wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:% U+ M$ V8 N  g' r7 Q2 H- t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:7 v, \; {2 V+ e3 B# y* ^# @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:& F7 W$ p# T8 ?$ z+ a" C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:& m% n8 d5 r: X! w8 E3 K: ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:, G5 P% k+ n- f* S( D/ B; h( N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
  g$ ?. X5 p( q$ J: ^* w6 V; NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
7 j. [; r$ K/ X* k6 U5 u2 I3 GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
" M% O+ D# Q, QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
. Y) G% u- {4 d+ XSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
5 e0 W# z; q6 f/ R& jSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
: n" }- C6 m' P4 q" w# a% v. lSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
8 U, E  o& }' c' G, TSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
) U' m& n, n4 B& }7 tSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
# A) z/ Q% M6 q8 v4 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
7 g' X9 B4 }* o0 ^2 {" j) {Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* O9 v* K& e# V- H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:. Q3 q# A( w+ O& C. l* N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:% y# ]' ^* ]7 q6 `1 _/ a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:( W2 o. ~7 Y  N% y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:7 z; J7 @) a8 [/ ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
7 |  s, o, A4 o+ F8 L) Q4 E& Z& l' QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
) N9 t# [/ e" pSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
' i! U: |4 p! W. B1 r% a7 R  N; O$ M) Y/ HSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:* H: K4 b1 J% A8 @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
+ U" E2 k+ D- m& \. z8 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:5 n$ T4 g% s, C: B
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:+ _0 w0 n6 a4 T7 J
Finished searching libraries- I( i5 H! I8 ]; B
Searching libraries  G& }# E$ u- i  @' [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:: V( W1 y- A8 C6 U0 V" y) I0 f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
: \* ]! X5 o  E; F; `Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
( k3 [; q: D' M) _4 ISearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
$ V# f2 B" Z7 ?2 ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
8 P8 u" }  u% C/ e. }Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
2 [' P: B* J2 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
8 C- t6 g7 W' F+ y- gSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
# W1 [2 t* U9 g7 _. l3 m2 USearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:. |9 L+ ]! e5 w/ J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:0 I0 e; V0 |! D) q% x( X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
+ z2 u  w+ [3 U* o" p. xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:, z' @" }6 t% ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
- O. o, u! o8 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:- H9 V3 F$ `5 f4 A; n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:5 j0 V5 }: N. P8 V& W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:! O- L+ a6 ^4 L5 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:) r* j, z# [0 i" ^: h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 p5 q1 M. ~: {  R7 e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
; V) I. r3 T( l5 hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
# W+ b% B+ }, R9 G' d0 ]Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:1 k3 L8 T+ b4 X+ a* Y6 B& D+ y& _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:! _2 h9 Y. w- `2 f; l3 M. s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:0 i5 T2 X$ j8 b: Z+ b; d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:6 ~( ?+ J( B% T* K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:0 y; Z9 N+ j% ]; F: y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
. N2 U9 u5 a5 i1 d- G8 r3 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:2 Y6 L  u6 Q8 u1 O& Y' y# @7 w6 N7 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:; T8 _! l  k* S3 w% n7 I. `) K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 L" S, T: ]9 }1 x: g& H
Finished searching libraries8 A9 w+ U; L" q3 M- w* P2 a7 ~# y
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
1 E( F( ~3 o4 m0 t( r8 \" rBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"2 p% D0 @0 _8 H: E' S9 h* r7 u" }
PerfMonDemo - 2 error(s), 0 warning(s)( {! C; q" @0 r
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
1 [+ u; k; @) _) ~& U; l& G& Z. f. T9 b: S* Z1 k( h3 h* C/ X
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。- r/ y% `! f3 b. j8 \: o) D
解决方法如下:$ `7 U* B& \, C) `2 b$ T. R
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
6 I% X  s  q$ a! B加入" a1 f1 _9 ?- J* j$ Y% s. g) W! ^
nafxcw.lib
& ]4 X6 k  i# J" w9 Klibcpmt.lib3 Z+ L, |; ~+ \! h. p
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library2 a# P% W" A; R/ ~  L
加入: n1 X- x8 g/ i! H
nafxcw.lib- Z, g: }% o6 _$ @1 M* N& _
libcpmt.lib- O' _6 V* H  ~* n- d- ], R) n. J

4 l2 E% g# `; v5 D  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:
! K" w6 Z: k( R5 J
8 E: d, s( p# F; P, U, C单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
3 \( j+ S3 M+ r8 i+ C多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 1 `+ q4 H% X$ Q! U( Q$ i
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
2 s) G8 V- F2 m" z, N; [$ X调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
3 L) _! V% c0 r/ r调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
- u3 g# j3 L/ Z- V( Z3 a使用 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++ 程序集安装为共享的并行程序集。6 W; C0 w' |3 f
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
) r3 X$ n9 \1 C1 ~. V+ x; ?就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。% e+ I' L* s" `
楼主的方法容易误导初学者6 G4 w; u, z# H: Y0 J) T
. v8 O9 S; `' B3 @% ^8 w
( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 11:05 , Processed in 0.017871 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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