天天看点

Win32 Application和Win32 Console Application杂谈

最近经常被VC的错误提示所困扰,总结了一下,共同学习.

   学习VC++时经常会遇到链接错误LNK2001,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。产生LNK2001错误的原因:一个是由于编码错误导致的LNK2001,在这不想详细说.另一个由于编译和链接的设置而造成的LNK2001.最经常发生的是:"LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol [email protected] ",产生这个错误的原因是没有为wWinMainCRTStartup设定程序入口. 认识这个错误首先在新建工程时要分清Win32 Application和Win32 Console Application.它们都是工作在32位Windows环境的程序.其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的.它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。而Win32 Console Application(win32控制台应用程序)往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它,

或者叫CUI(Character User Interface字符用户接口)。 

 遇到如下链接错误:

Linking... /subsystem:windows

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol [email protected]

Debug/TestWin.exe : fatal error LNK1120: 1 unresolved externals

Error executing link.exe.

解决方法是:将project-settings-link的project options里的 /subsystem:windows

改成 /subsystem:console 因为Win32 Application的入口函数为WinMain

Win32 Console Application的入口函数是main 也就是说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了

而Win32 Application和Win32 Console的区别就在于VC里链接参数不同

一直只是用MFC开发上层的应用程序,也没有去在意什么Win32 Application、Win32 Console Application等开发。

        终于到了这么一天,偶要开发一个不需要界面的服务端数据处理程序。在这个重要的Moment,偶也想在沉闷的工作中搞搞新意,于是就在新建工程时选了Win32 Console Application。

        我建立的是一个空的工程(empty Project),需要自己加文件。我也是无聊,偏偏加了一个Main.c的文件。然后在该文件加main入口,这时一切都很顺利,入口没任何处理,就是一个返回。执行能通过。

        通过后我就加了一句话:

        cerr << "Ok." << endl;

        弹出出错信息:error C2065: 'cerr' : undeclared identifier,想想,少了包含头文件iostream.h,于是加上。

        再运行,还是出错!!这下我急了,没道理,别人能用,我就用不了啊!VC又不知道偶长得帅不帅,怎么可能偏心呢!花了几个小时到处改设置,甚至在网上动用了所有的搜索引擎,都查不到原因,真是郁闷!现在才后悔当初没好好学习……

        最后,我想只有放弃了,反正用MFC又不犯法,何必跟自己作对呢!就在这最后的一个Moment,我又再次无聊地把Main.c这个文件改名为Main.cpp,顺手编译一下,TMD,通过了……

        总结一下,想想这就是c和c++的区别了,但我发梦都没想到,居然这种区别会和文件名相关 

继续阅读