【转】win32 Application和win32 Console Application

这几天在创建MFC项目时,常常遇到一下两个连接错误,例如:

1. LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main解决方法:
  [Project] --> [Settings] --> 选择"Link"属性页,
  在Project Options中将/subsystem:console改成/subsystem:windows.

2. 还有一种经常出现的相反的情况

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

    解决方法是:[Project] --> [Settings] --> 选择"Link"属性页在project options里将/subsystem:windows改成 /subsystem:console

  这两种错误可以参考下面的解释:

  首先要理解Win32 ApplicationWin32 Console Application的区别。它们都是工作在32位Windows环境的程序,Win32 Application 就是普通的常见的窗口应用程序,它们都是所谓的GUI(Graphics User Interface图形用户接口.而Win32 Console Application(win32控制台应用程序)是CUI(Character User Interface字符用户接口),就像MS-DOS窗口的样子出现一样。

  然后建立不同的应用程序为什么会出现连接错误呢?

  原因是Win32 Application的入口函数为WinMain ,WinMain是windows API窗体程序的入口函数。
  Win32 Console Application的入口函数是main ,main是C/C++的标准入口函数名。

      也就是说,如果要编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,那么,上面提及的链接错误就就经常出现了。

疑问:winmain和main底层有什么关系呢??

      WinMain是MFC提供的入口,MFC会将其main进行封装然后以WinMain的形式提交给用户使用。这样用户就不用考虑Windows图形编程中的若干窗口初始化问题。

      main函数是C语言的标准,任何可执行的C语言代码程序都必须包含main函数入口,它实际上是由标准C函数库对入口地址进行了封装以后提交给用户使用,这样用户就不用考虑一般应用程序入口的初始化问题(例如设置环境变量、参数预设、堆栈填充等),如果不使用MFC的话,可以直接用main函数加上Windows的API实现图形界面窗口程序。

      真正的程序入口在汇编层面被描述为__start,链接器对其识别并将其制定为函数的入口,装载器在装入程序的时候将其赋给PC实现控制权的转移。

   

看别人的博客里说连接时还出现下面的几种error LNK2001错误,顺便借用一下,留着以后查找方便(但是我还没遇到,还是编的少啊,呵呵……)

1.libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
  Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows

2.程序入口设置错误, 提示:
  msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"C/C++"属性页,在Category中选择Output,再在Entry-point symbol中填入wWinMainCRTStartup, 即可

3.线程运行时库设置错误, 提示:
  nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
  nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
  这是因为MFC要使用多线程时库, 需要更改设置:[Project] --> [Settings] --> 选择"C/C++"属性页,在Category中选择Code Generation,再在Use run-time library中选  择Debug Multithreaded或者multithreaded其中,
  Single-Threaded 单线程静态链接库(release版本)
  Multithreaded 多线程静态链接库(release版本)
  multithreaded DLL 多线程动态链接库(release版本)
  Debug Single-Threaded 单线程静态链接库(debug版本)
  Debug Multithreaded 多线程静态链接库(debug版本)
  Debug Multithreaded DLL 多线程动态链接库(debug版本)
  单线程: 不需要多线程调用时, 多用在DOS环境下
  多线程: 可以并发运行
  静态库: 直接将库与程序Link, 可以脱离MFC库运行
  动态库: 需要相应的DLL动态库, 程序才能运行
  release版本: 正式发布时使用
  debug版本: 调试阶段使用

转载于:https://www.cnblogs.com/Hsing-Faith/p/5260548.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值