a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 51|回复: 0

[C语言] C技巧:VC中编译、运行程序的知识点(2)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
C技巧:VC中编译、运行程序的知识点(2)
4 N/ F' V4 @# g; h0 m. E2、常见的编译参数
: o4 u# P' P$ w: T$ R# n6 S  VC建立项目时总会定义"Win32"。控制台程序会定义"_CONSOLE",否则会定义"_WINDOWS"。Debug版定义"_DEBUG",Release版定义"NDEBUG"* b1 p% [& m4 W6 l7 |+ M! Q
  与MFC DLL有关的编译常数包括:" _! I4 t- c) a$ R2 z( b
  _WINDLL 表示要做一个用到MFC的DLL
6 B+ A) _% c+ H1 R' ^8 y0 N$ B  _USRDLL 表示做一个用户DLL(相对MFC扩展DLL而言)8 k& l7 B% c4 G. n
  _AFXDLL 表示使用MFC动态链接库
9 C% H' t8 p1 B4 t  _AFXEXT 表示要做一个MFC扩展DLL
3 c( X8 t, E9 O2 A+ V  所以:
) n! `& E3 k2 r. ~  Regular, statically linked to MFC _WINDLL,_USRDLL9 q7 C" L- r& `- [% L
  Regular, using the shared MFC DLL _WINDLL,_USRDLL,_AFXDLL
' Q' j1 }9 A. k  Extension DLL _WINDLL,_AFXDLL,_AFXEXT7 p% O9 v! V# \" D, T) [
  CL.EXE编译所有源文件,LINK.EXE链接EXE和DLL,LIB.EXE产生静态库。& P3 M! n( Y. B; Q4 Q: U+ X4 {; x
  3、subsystem和可执行文件的启动
$ L/ y' j. y9 g1 Z, G7 D  LINK的时候需要指定/subsystem,这个链接选项告诉Windows如何运行可执行文件。. e+ q& u+ z1 P4 N1 }7 S4 j  o
  控制台程序是/subsystem:"console"* ]& l1 @5 D' O
  其它程序一般都是/subsystem:"windows "
; F; ^) O) g; N: P  将 subsystem 选成"console"后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。
% c# C7 X# M9 ]/ `  如果选择"windows",操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。
, U3 G8 E. _2 P$ M. _  可执行文件都有一个Entry Point,LINK时可以用/entry指定。缺省情况下,如果subsystem是“console”,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:8 X2 o4 d+ M" r4 v
  /subsystem:"console" /entry:"mainCRTStartup" (ANSI)
4 Y5 t3 w- Z" z  O+ ^1 s  /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE), O- z, A3 v  c5 }
  mainCRTStartup 或 wmainCRTStartuup 会调用main或wmain。7 d8 E, Z6 m6 p
  值得一提的是,在进入应用程序的Entry Point前,Windows的装载器已经做过C变量的初始化,有初值的全局变量拥有了它们的初值,没有初值的变量被设为0。( k* S2 q6 Z0 g
  如果subsystem是“windows”,Entry Point是WinMain(ANSI)或wWinMain(UINCODE),即:9 p# W& I3 B! `3 [1 d+ |
  /subsystem:"windows" /entry:"WinMainCRTStartup" (ANSI)6 X4 g$ M/ R" W  V
  /sbusystem:"windows" /entry:"wWinMainCRTStartup" (UINCODE)
; o( H6 {3 j3 @* c/ y  WinMainCRTStartup 或 wWinMainCRTStartup 会调用 WinMain 或 wWinMain。
, K+ a9 J" ~6 }& @5 |& |  这些入口点函数,在CRT目录都可以看到源代码,例如(为了简洁,我删除了原代码的一些条件编译):: T# @% `. d! Z+ N+ }. V
  void mainCRTStartup(void)& F& C5 Z8 y* k
  {- Y6 [; I. N3 x1 o* c8 A
  int mainret;) [. `( r; p- }; }9 n+ I1 f) w; ?
  /* Get the full Win32 version */
3 _% R5 O& g6 E% P: x9 y8 \  _osver = GetVersion();4 B( D) r# |) a% C( v8 v: f
  _winminor = (_osver >> 8) & 0x00FF ;
9 ~% ]) M& y) J# X& v. q  _winmajor = _osver & 0x00FF ;& q& G" W/ O9 i# s% C9 y( w$ I
  _winver = (_winmajor > 16) & 0x00FFFF ;
# V: s$ w4 @2 T  #ifdef _MT: M7 ]$ I& C" T
  if ( !_heap_init(1) ) /* initialize heap */
( Z* `# b& X/ S% r$ w3 x  #else /* _MT */
; v" t/ g" ?$ g, b* c/ g  if ( !_heap_init(0) ) /* initialize heap */- c# U) n% x2 o$ h4 P
  #endif /* _MT */
5 L7 W+ B+ C! T2 |! Y  fast_error_exit(_RT_HEAPINIT); /* write message and die */% W& @2 a3 P% t* R/ {$ D% S/ w
  #ifdef _MT
4 @8 x3 c- s! |# x0 ~( [  if( !_mtinit() ) /* initialize multi-thread */
2 b% w! @7 M! e  fast_error_exit(_RT_THREAD); /* write message and die */0 C$ q( R' K! Q# f. [8 @8 z
  #endif /* _MT */
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 22:48 , Processed in 0.194548 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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