您现在的位置:汉网天下 > 认证考试 > 等级考试 > 二级 >

C技巧:VC中编译、运行程序的知识点

来源:未知  作者:未知 责任编辑:汉网天下 发表时间:2012-01-06 12:28 点击:

2、常见的编译参数

  VC建立项目时总会定义"Win32"。控制台程序会定义"_CONSOLE",否则会定义"_WINDOWS"。Debug版定义"_DEBUG",Release版定义"NDEBUG"

  与MFC DLL有关的编译常数包括:

  _WINDLL 表示要做一个用到MFC的DLL

  _USRDLL 表示做一个用户DLL(相对MFC扩展DLL而言)

  _AFXDLL 表示使用MFC动态链接库

  _AFXEXT 表示要做一个MFC扩展DLL

  所以:

  Regular, statically linked to MFC _WINDLL,_USRDLL

  Regular, using the shared MFC DLL _WINDLL,_USRDLL,_AFXDLL

  Extension DLL _WINDLL,_AFXDLL,_AFXEXT

  CL.EXE编译所有源文件,LINK.EXE链接EXE和DLL,LIB.EXE产生静态库。

  3、subsystem和可执行文件的启动

  LINK的时候需要指定/subsystem,这个链接选项告诉Windows如何运行可执行文件。

  控制台程序是/subsystem:"console"

  其它程序一般都是/subsystem:"windows "

  将 subsystem 选成"console"后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。

  如果选择"windows",操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。

  可执行文件都有一个Entry Point,LINK时可以用/entry指定。缺省情况下,如果subsystem是“console”,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:

  /subsystem:"console" /entry:"mainCRTStartup" (ANSI)

  /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

  mainCRTStartup 或 wmainCRTStartuup 会调用main或wmain。

  值得一提的是,在进入应用程序的Entry Point前,Windows的装载器已经做过C变量的初始化,有初值的全局变量拥有了它们的初值,没有初值的变量被设为0。

  如果subsystem是“windows”,Entry Point是WinMain(ANSI)或wWinMain(UINCODE),即:

  /subsystem:"windows" /entry:"WinMainCRTStartup" (ANSI)

  /sbusystem:"windows" /entry:"wWinMainCRTStartup" (UINCODE)

  WinMainCRTStartup 或 wWinMainCRTStartup 会调用 WinMain 或 wWinMain。

  这些入口点函数,在CRT目录都可以看到源代码,例如(为了简洁,我删除了原代码的一些条件编译):

  void mainCRTStartup(void)

  {

  int mainret;

  /* Get the full Win32 version */

  _osver = GetVersion();

  _winminor = (_osver >> 8) & 0x00FF ;

  _winmajor = _osver & 0x00FF ;

  _winver = (_winmajor << 8) + _winminor;

  _osver = (_osver >> 16) & 0x00FFFF ;

  #ifdef _MT

  if ( !_heap_init(1) ) /* initialize heap */

  #else /* _MT */

  if ( !_heap_init(0) ) /* initialize heap */

  #endif /* _MT */

  fast_error_exit(_RT_HEAPINIT); /* write message and die */

  #ifdef _MT

  if( !_mtinit() ) /* initialize multi-thread */

  fast_error_exit(_RT_THREAD); /* write message and die */

  #endif /* _MT */

    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    验证码:点击我更换图片
    最新评论 更多>>
    广告服务 - 关于汉网天下 - 客户服务 - 版权申明 - 友情链接 - 网站地图 - TAG标签 - RSS订阅
    Copyright © 2009-2011 hanwangtx.com 汉网天下技术 版权所有
    友情联系QQ:530275807
    滇ICP备09010630号