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

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

[复制链接]
发表于 2006-11-14 15:23:13 | 显示全部楼层 |阅读模式
    这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时,问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"。这个问题似乎许多人遇见过。在CSDN和微软社区里面都有人提到,但是没有完整的解决方案。这个问题的解决一共会遇见2个子问题:4 N) A& g+ b% s1 T# C6 ]& A, L' n
  最早出现这个错误我和许多人认为的一样,认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后都无法解决问题,最后确认不是由缺乏DLL所致,因为程序是纯win32的应用程,非托管代码,所以也无需.net framework。# P/ V  K, C% _
  Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的,而动态MFC库使用的是Multi-threaded DLL (/MD)。由于XP对于PE文件格式监测更加严格。就会导致部分使用多线程DLL的可执行文件在调用的时候出错。修改项目属性的编译开关:
+ d. u& U. h. H4 y$ ], s# MProject-&gtroperty->configuration Properties->C/C++->Code Generation->Runtime Library8 g8 |: f5 `  d1 u  D9 X5 \6 u3 Y8 Q
/ K; y+ v, F" \) S! q. z
修改成Multi-threaded (/MT)! B  m* [3 U5 N& Y, |5 R6 @' B

0 V" D5 d5 p" w, f4 d修改了Runtime类型以后
! k8 r, }: n1 j! q( v3 V; G- o4 C' ~3 U- a: V( Q1 m
需要将MFC的编译类型也改成静态库:
& {1 z. R) g/ o( X1 S9 tProject-&gtroperty->configuration Properties->General->Use of MFC
' W4 ?. Z! k1 `; d7 F修改成Use MFC in a Static Library
1 ~8 N2 X$ Z& p0 C: U( W4 p1 W- Q
6 B9 i; r' E# d6 g一部分情况下在这步就能解决问题, K  v7 }; u7 D
另外一部分情况会遇见如下情况/ A# m" C# B9 y

4 F) X1 R& O5 ~, I* B编译器报错:
6 D7 k- H7 x8 }0 G! ~! |
' @/ J" \' l- g7 O3 A1 k  G3 N$ {CODE:
9 C5 x- R& z. m! Q1 ^) K" [1 Onafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
' r3 z) J" L# D/ l% a1 M
/ @5 M! B# I- ~( z6 l/ C产生这个问题的原因是库依赖关系:6 q0 r2 c& F) a
在Project-&gtroperty->configuration Properties->Linker->Command Line
# f, G" R/ q1 F& h, J5 W加入编译开关/verbose:lib可以显示详细的库链接顺序/ R! v& y# m. J3 N1 g8 a
3 e$ g( _+ U  L2 d5 T3 T2 D
CODE:) x, D3 F7 S& A7 @/ s
: M2 X+ a' w0 z" R& r
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------* r" n+ {6 R9 P* R
Linking...
! v0 S/ R# @9 j, |7 f. m+ ~Searching libraries" J+ R# Q+ a& j1 m3 N$ G& X
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:8 x* e, `( o$ N. K
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
1 p4 Q; Q  t7 K8 }7 A! c1 t# t- L1 A$ eSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:" d4 H; u& l! r4 w; d1 ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:9 E6 U6 H5 Q& `8 _$ @# u5 z% h/ P
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)9 l! T8 l- ?' D* Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:# g9 P- E- @- s2 E9 h* @! t
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:- B7 c+ F3 o3 I* s
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:' S# Q8 `, u* [
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:, ~6 U$ H) K$ c4 ]$ q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:  i! L( ]3 d( E! ^0 ~; ^6 o2 y, M
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:4 N" U% d# f! ^! H0 f7 l2 U# ~
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:+ A: _0 W9 I. f$ g% K5 m0 K0 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
( O2 U8 |3 j7 i9 o2 g6 b. WSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:/ ^% a& r9 m9 r2 `6 y+ v; l8 |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
* N( i; [1 H  L" L, hSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
/ D$ j9 O5 o9 R: ~- x6 u5 FSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
+ \% l- T; z3 |- v- I, NSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:/ T/ u) I, i* D4 _' h, N% Z7 T  i# f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:7 Q( l& B6 S5 G# H+ ]& R: M& i3 ]
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
4 p6 i0 m% _1 B$ {( q, \' P3 xSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:8 z! I6 h  d3 f% i# l& E0 F- l
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
9 H3 @! C2 d7 d5 sSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:# z* T9 b" ?6 ^6 x
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
+ L2 k/ C; x7 j# J3 u/ DSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:8 S: E" a/ V. W* M6 _
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:( |) G. I8 U4 B. R  Y0 I2 e- q
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
7 ]" e+ o7 D2 z/ eSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
( j9 y, R/ X. k+ m9 Q) wSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
1 W, ]' L/ C4 q+ }' ]8 c6 nSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
5 n! J5 D$ z! }, }4 u: fSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
' M9 ^+ Z1 U5 p8 B! P4 ^Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:# Q2 X1 S$ f. M) S7 F) K1 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
9 _7 P4 S) U( m& sSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
4 a  l% _, v8 _9 f( Y5 N2 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:2 c; g. k3 ~6 y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
' B4 P; F9 w" N' SSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
! y! o# P6 \: z& p/ o9 iSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
7 b. B0 X" x0 T- |" [Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:3 |8 |. `+ j8 m  |
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
8 [* W& V% {- `Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:1 }* W2 @1 s) |  `! r1 m
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
1 k: A& A; W! A+ y' w* s/ O+ GSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
9 r( H$ i8 ~, @5 N* H6 o# K' rSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:" |* @, x* s# v2 ~- z4 G8 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:' [3 H  f. d( N1 I, f
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:- r5 U1 `9 K' \2 e# h4 A
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:9 i% V3 [% j9 k' \2 o% K: D
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:& D8 }* ~; p+ a. ^; Y
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
* r: T6 O. U# C' O0 ~Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
$ r( \  X! |, VSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
) u( B3 r4 c2 ~# w! m7 D$ d/ l$ uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:/ A3 o5 `' m& e
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:8 M: S& u/ O$ j
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:0 ]/ `2 Z! \5 l' c4 A  D7 D
Finished searching libraries
  R3 K( r' D. r7 @$ Q& [, h! zSearching libraries
  [' L* i) ]) q1 z  @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:) {6 o( Z! M; A; ?: q4 r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
* r& S+ F. F- `  E3 b" m8 b% F$ ASearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
" B  U' T3 e5 r1 k% cSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
4 q" j/ ]: M- u8 ^9 [$ [' JSearching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
2 I  [8 Y3 U% [8 @. ESearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:. F$ N6 z4 h& N( E3 q/ y$ c$ h2 \
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:, O7 F0 T0 `/ [  g) C% `( a
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:  W# f. n: N* N$ `
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
3 j) M) E; u* {/ y7 _Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
* |! x7 q: ?1 V: OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:) y. ^0 n/ ^0 }& p
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:2 y" A. }6 j8 ]$ ]( d
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
7 z4 j  U1 `+ M- @% y- L7 T; aSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
" f% c/ G1 O& n0 D4 H* QSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:" _% a& S* y3 T' z8 y! e1 b0 z
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:7 M% {$ k- [" x6 P
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:' d. T& }# t; x$ ?
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:9 |# J  Z' ]* |+ P( b5 N
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
$ e" C) i! q  s5 OSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:/ j% i9 b7 c, G$ W& {0 [  r
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:8 x1 g" ~. p" N# d# Y2 F
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
  G$ R$ ^- {2 a+ @Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:* U2 A7 {# t. Q9 W
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:! ^* k/ G% b$ b! E" j% u
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
: ?, ]) h% o" ^( T4 X6 uSearching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:9 f3 w* d: [# n$ z( E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:" V5 d1 z$ F6 E
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
$ V1 d6 z0 u! ~1 @+ dSearching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
9 i' G4 _! S. V$ U- `2 H! ]$ n6 K: tFinished searching libraries
5 R9 E3 z+ T2 V.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found. F" v0 v3 T% A+ a
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
+ [% P! t2 I, G6 l4 nPerfMonDemo - 2 error(s), 0 warning(s)
1 }' J% B3 t3 N! Q========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========% b' L( e0 r, s# @. `) v! p; r
8 F: e% i% t7 N2 ~4 f- t
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义。
- \" O' L8 O( f* a& J  M7 k8 W4 C解决方法如下:# b0 R* V/ V! U7 p8 ]
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
# o; ?: e2 v' ^6 Z/ {/ ]# b加入
8 x2 M- r4 K, F5 m3 e0 V# ^$ v* Inafxcw.lib
' F/ u0 U% m% I/ flibcpmt.lib
: t$ \; J! a+ G3 Y* OProject->Property->configuration Properties->Linker->Input->Ignore Specific Library! a  Q9 |& Q0 Y* g" g0 G
加入* h) e' O( t$ b8 O
nafxcw.lib
  _; ^# X: |8 h: O8 ]. U0 Plibcpmt.lib
5 p" I0 J8 b) P- M2 H4 o
2 `8 c+ l5 w% M3 G8 z: s, G0 ~' F  这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用.这样就避免了这个问题。下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:2 U1 k; \8 D* x

: y0 Q, ~& U) P- d& X. c5 G2 E# T单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 5 O1 ~& n1 q# ]* [" Z( k5 x& ]
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
$ z# d; B* V6 F( r1 c& R使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib ) F/ h& Q( D- ?% G: r3 I5 C
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
( |/ U3 V$ \1 B, }调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
3 v0 ?8 J7 k* \. d' v使用 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++ 程序集安装为共享的并行程序集。) h# Z: M8 O  @! l$ x
或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集,
1 `6 a5 l% g, {3 J* Y就是把Redist 目录中提供的文件的相应版本复制到应用程序目录。另外清单文件(.manifest)里面也可以看出是在哪个目录下搜索DLL文件。1 h9 f9 w* @. Z3 B) A
楼主的方法容易误导初学者& z( |" `$ K5 i+ s& V; N

5 ^' J  W# h9 r* U' T+ U" {; h( conry 发表于 2006-11-11 17:33:00)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-15 01:43 , Processed in 0.022261 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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