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

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

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

% C: p  H) {  u& T- G- p修改成Multi-threaded (/MT)/ A1 @7 {0 ]5 r6 l3 ]) w% H
/ o0 O9 J- U0 C8 i; ?7 K* a
修改了Runtime类型以后, @+ i2 [6 E, X

" q. U; d+ L0 P7 S' S* C需要将MFC的编译类型也改成静态库:7 L+ u  n; j! c# R
Project-&gtroperty->configuration Properties->General->Use of MFC0 A* c4 b& f7 S* I: x
修改成Use MFC in a Static Library9 V% v' [$ ?$ S

8 L9 G( P4 D: ~- D5 X* G: [一部分情况下在这步就能解决问题
0 v# [" X( e6 U% n4 b- a7 V9 z另外一部分情况会遇见如下情况
; R) _8 c4 k6 ^  m! r: [! D* k" I9 H) ~# `. o4 M- h0 V2 a
编译器报错:
( ~. y& u+ B) R
5 ^9 j$ m% C- m3 u- DCODE:
9 P) n* H" V% s& C4 Q( x, g$ V, Mnafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
" m8 w8 L: O1 p8 l% r" e1 E
0 A* B) E: f' X  G& g产生这个问题的原因是库依赖关系:
) Y& Q+ Y9 M0 T+ E5 Z% c$ c在Project-&gtroperty->configuration Properties->Linker->Command Line, \& [: n6 `, ?$ y3 Z- [$ `
加入编译开关/verbose:lib可以显示详细的库链接顺序0 u8 [$ v: B+ w. a" R8 Y
: o4 u) A7 m7 l* B- V
CODE:2 @+ G6 i, [% L* g7 f0 v% [6 N8 f

0 R) v; l: }0 R2 x4 U------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------% \0 `8 T- `3 o  y9 i" N
Linking...
* A% L% Y3 b  p* lSearching libraries
+ h# f- y: U# [) j3 j* @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:& j& m) D1 N2 p& K' B4 R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
0 s& A. {2 ~9 y3 ?Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:$ U5 R; p! C- Q; v" N! _! v  I( y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:- s7 i0 T0 a$ |$ l) n7 s, c
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)- Q9 D6 F$ L) d& S7 Z' a4 n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
. w  q+ \8 G( V. q. |( e& JSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
# @" U' ]8 j* FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:0 Z! C) q' k  P7 u8 k
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:; H6 k$ X' N. n: P7 j4 o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
" S! @7 z% n% WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
. P5 ]7 U# a" ?8 a: G+ @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
( d6 g! y5 V0 {" o4 y( M: OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:# S* m9 T1 B  y' j% k. ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:2 |# X4 b2 w5 s0 B" O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:/ L* }7 U9 u1 m! C
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:% X7 W8 J0 ?# }: J' x3 g) p+ n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:% U+ Y, L3 ^5 p4 G5 p7 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:) l# f+ h: H; O8 T- ^
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
" k% u) W9 p+ d, a8 `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
9 O3 @5 i& {1 }/ d! w9 R$ @/ xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:# K0 {$ v# [3 S6 _" x# P6 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:' }* ?5 X- s, y6 X' I" Y5 H
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
7 m( P4 Z; {' L+ `7 M8 f4 M3 V3 CSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:% }* S% T  Y5 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
/ \/ ~5 E9 Q1 T. w% ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:; e, A6 g+ U# c" o) o
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:( W( U8 f4 Z- f0 z$ A% A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:' j$ `5 U! d9 B. k3 H* N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:9 |  m" ~! {, O2 t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:2 e1 E3 i. X7 L$ Z' s, a  R* W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:9 f+ G/ b2 E3 ^8 s; C. c" @
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:* _/ t- R. P  y" x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
8 z# h! G2 T+ j1 i- j  uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:, j+ s1 v) t  t0 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:, Y& ]7 b8 M  u8 u- L
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:6 k) g  d: i0 m  ?" s1 Z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:) b; P8 v. Y; Z& v$ {' k, a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
, x5 G9 s3 V! [( g% aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
# ?6 t+ S- t5 A$ u* ^9 j2 {2 \Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:6 B) C- l6 D5 O( U1 Q1 u6 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
% D2 p& i. y% wSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:& U3 J6 m  w4 t' b( b0 ?5 A1 t! v
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
* p" o4 `6 a4 |$ z3 I* u. z7 K) LSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:: e# d2 [' B3 C  b7 z4 f. |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
  d  Z: _: i' ?; S; y. S4 MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:* w  r7 c' x- z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
" V, E* \' H' v; lSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
) L6 H5 O+ G6 p6 w/ B( [2 BSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:1 A8 Y4 P6 N9 B3 l" T* q2 W# J
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:5 h2 v, W) f* [3 u0 B9 R* b& o7 |4 Z) F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:. C1 o- S1 \6 W1 z% Q4 }4 l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:7 f) Z2 F' M6 c
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
! z2 H) H: ^3 YSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:' K  S* J; O+ u: {$ o2 y+ b/ ?
Finished searching libraries" b. U" h/ M& ^; e, u
Searching libraries4 |* f3 B: e9 z+ W/ ]9 T% u5 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
6 h9 r4 [6 V$ g9 zSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
+ o3 ]' O9 k2 A0 \8 d' FSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:1 Q6 e3 r0 D% t! n
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
" d  P1 N  ^$ O" _( ~. p$ ISearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:+ ~, G, `* W4 ?) F8 b; K; R% }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:0 Z6 t9 {7 t7 O
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:" a& J% ?  w9 U2 r3 ]5 X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
! {4 f0 e. [. v  k/ _/ ySearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:& D8 v1 F( y2 i9 n8 {
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
7 n; ]1 w1 E9 l) B  t3 W) j  ASearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:2 g- o0 D# w- R+ h" e' Q0 ^  _# W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:$ Z- _$ u& w/ ?. J- Y8 h
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
$ m. k- O6 H8 N% j+ s# [  ?, qSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
) h) y  g  B6 q* MSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
" {3 @" b4 F2 Y- ]+ _% m; b4 ZSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:  H# }- B! }+ P: @# c7 g
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:* a: A/ @& e+ t9 i+ c6 H2 o0 }
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 V- Z- [0 |* f. H# r# ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:6 Q6 N9 d' _' t: L! V( b
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
- `% y! K1 L/ P& dSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
7 E( h8 m) G, w3 a6 WSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:" q# O. n0 N& _6 u: ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:  d3 E  U: h) Q. ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
! M2 n/ }' E+ I$ [! r( o  dSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
. p/ e! }. t/ W, ]+ c# h6 mSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
' B: X; f' `$ |2 E* {" MSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:0 {2 X+ q. h6 O* r5 T; ^$ w! A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:; L% z% c: r. o( R
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
1 ~+ U5 C2 `  U. iFinished searching libraries8 k2 k4 J, N' ?4 X
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
" w2 }4 x5 ]6 P. A( w+ LBuild log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"1 o- ]7 z- |4 v  x% ?* {
PerfMonDemo - 2 error(s), 0 warning(s)
4 f  e8 Q& L4 ]$ U( e========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========6 D9 l  S% q6 g! Y

) j" l5 U' `& p我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。7 l& y1 {: _* t5 o0 F- L! A
解决方法如下:; E$ x9 h9 K5 Y# p, _* K
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
3 ~# m/ @8 K, o/ B! M加入
6 ]* q3 O2 H3 z# V( d8 Unafxcw.lib
( g+ U) N9 L* K# Flibcpmt.lib
+ z; v( p$ T- YProject->Property->configuration Properties->Linker->Input->Ignore Specific Library3 n6 j% F6 K' k  X
加入7 k; V6 ?% n+ D: [# c/ D
nafxcw.lib
: w. s- c2 ]# B1 R% B" T+ {. zlibcpmt.lib
' E" F) Y5 U& w" ]) Y. U/ \0 ]0 Z
: f/ p+ b- d& J8 [, \  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:" W: _& u9 n& |
# J& p, w6 z0 H& y! [
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
" J8 U! M+ w' o# {多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ; Q  _2 H9 B. V
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
$ O4 d3 M1 S0 B7 F1 \/ B5 {: Y调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
$ f8 p0 z% G: N/ W% G! ^调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib . U- W# J$ }7 H, l
使用 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; W  O$ @' I. V: X7 M6 M或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
. E9 C1 |. h* T就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。7 V9 P/ g8 L0 y8 l8 {# Q5 i
楼主的方法容易误导初学者
- R7 X9 b1 a, n3 W' W, R
- u3 \& I/ N8 `* r( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 17:43 , Processed in 0.036526 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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