这几天在创建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版本: 调试阶段使用

(转)win32Application和win32ApplicationConsole的更多相关文章

  1. Win32-Application的窗口和对话框

    Win32 Application,没有基于MFC的类库,而是直接调用C++接口来编程. 一.弹出消息窗口 (1)最简单的,在当前窗口中弹出新窗口.新窗口只有“YES”按钮. int APIENTRY ...

  2. win32程序通过LPCREATESTRUCT中的lpCreateParams传递参数给窗口过程函数

    win32窗口程序中如果需要给窗口过程函数传递自定义参数,可以通过LPCREATESTRUCT结构体中的lpCreateParams进行传递. 创建窗口实例函数: m_hWnd = CreateWin ...

  3. MFC编程入门

    一. 什么是MFC? 如果你要建立一个Windows应用程序,应该如何下手? 好的开端是从设计用户界面开始. 首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象.Windows用 ...

  4. 使用 VS2012 开发 IDA GUI 插件 WIN32 SDK 和 内置函数 AskUsingForm_c

    1. 执行菜单的File->New->Project… (Ctrl-Shift-N)打开新建工程窗口. 2. 展开左侧的Visual C++项目模板分支,然后选择右侧的Win32 Proj ...

  5. VS2010 + IDA SDK 搭建IDA Plugin开发环境

    http://www.h4ck.org.cn/2011/11/vs2010-idasdk6-2-ida-plugin-development/ 1. 执行菜单的File->New->Pro ...

  6. Windows编程 Windows程序的生与死(上)

    引子 “Windows 程序分为‘程序代码’和‘UI(User Interface)资源’两大部份,两部份最后以RC编译器(资源编译器)整合为一个完整的EXE 文件.所谓UI 资源是指功能菜单.对话框 ...

随机推荐

  1. [CareerCup] 11.5 Search Array with Empty Strings 搜索含有空字符串的数组

    11.5 Given a sorted array of strings which is interspersed with empty strings, write a method to fin ...

  2. gdb学习

    gdb学习 [参考资料] http://www.cnblogs.com/jiu0821/p/4483804.html 程序的运行状态有"运行"."暂停".&qu ...

  3. 掌握GCD以及后台永久运行的代码 (使用GCD处理后台线程和UI线程的交互)

    一个例子: 在iPhone上做一个下载网页的功能,就是:在iPhone上放一个按钮,单击按钮时,显示一个转动的圆圈,表示正在进行下载,下载完成后,将内容加载到界面上的一个文本控件上. 使用GCD前: ...

  4. iOS项目重构日记

    如何重构 首先,要对程序的一般架构烂熟于心,尤其是MVC,这是基本.还有就是分离存储和网络请求的逻辑. 对于一些常用的控件尽量分离复用,设置开关函数,适当的时候开启,不要的时候关闭,有必要的话还可以 ...

  5. 如何用Android Studio打多包名APK

    问题:项目中不同的分发渠道可能需要打包多种APK(同样的代码),包名可能是不一样的,如果一个一个修改包名重新编apk是很麻烦,可以参考下列步骤在Android Studio上操纵Gradle来打包不同 ...

  6. HTML5 中canvas支持触摸屏的签名面板

    1.前言 最近实在是太忙了,从国庆之后的辞职,在慢慢的找工作,到今天在现在的这家公司上班大半个月了,太多的心酸泪无以言表,面试过程中,见到的坑货公司是一家又一家,好几家公司自己都只是上一天班就走了,其 ...

  7. CSS3小分队——进击的border-radius

    上一篇:<CSS float属性小解——”浮“生若水> 写在前面: ~~强势插入~~如果有想进一步了解float属性的小伙伴,可以猛戳上面的链接,<CSS float属性小解——”浮 ...

  8. 如何将Gate One嵌入我们的Web应用中

    参考文档http://liftoff.github.io/GateOne/Developer/embedding.html 从https://github.com/liftoff/GateOne下载的 ...

  9. 我的bootstrap使用的历程

    1.bootstrap快速开发,和amaze一样,同样是自己布局,然后找对应的模板,然后复制. 2.bootstrap实现的不完美的地方,我们要靠自己的样式去解决. 典型的居中布局, containe ...

  10. 第四十课:CSS3 transition详解

    W3C中对transition是这样描述的:允许css的属性值在一定的时间内平滑的过渡,也就是说,以动画的效果改变css的属性值. transition主要包含4个属性值:transition-pro ...