/*转载请注明出自 听风独奏 www.GbcDbj.com */程序员
Windows应用程序分为GUI(Graphical User Interface)和CUI(Console User Interface)程序,不少人却会误认为Windows程序就是GUI程序。函数
不少初学者使用Microsoft Visual Studio 编写程序时常常会错误地建立程序类型,致使出现”unresolved external symbol”的错误,缘由在于Visual C++的连接器开关设置问题。该开关在: 项目属性->连接器->系统->子系统。post
首先,建立GUI程序,对应开关设置为: WINDOWS(/SUBSYSTEM:WINDOWS),建立CUI程序则对应:控制台(/SUBSYSTEM:CONSOLE),都已默认选择的了。spa
其次,对应GUI程序的入口点函数为_tWinMain,而CUI则为mian。然而系统并不真正调用这两个入口点函数,他们是由”可执行文件的启动函数调用”,而启动函数系系统根据连接器开关的设置来选择加载哪个启动函数,启动函数与入口点函数之间的调用必须正确对应,认识这一点很重要!blog
函数类型和入口点函数,启动函数之间的对应关系:get
应用程序类型 - 入口点函数 -嵌入的可执行文件启动函数io
ANSIC版本的GUI程序 - _tWinMain(WinMain) - WinMainCRTStartupclass
UNICODE版本的GUI程序 - _tWinMain(WinMain) - wWinMainCRTStartup引用
ANSIC版本的CUI程序 - _tmain(Main) - mainCRTStartup程序
UNICODE版本的CUI程序 - _tmain(Main) - mainCRTStartup
如今认识清楚了错误缘由后,咱们来一块儿分析下错误和如何去修改:
如今假如一个程序员想在控制台程序下调用MFC和Win32API函数时,他会建立一个Win32应用项目,即GUI程序,而后编写main入口点函数。
首先连接可执行文件时候,连接器会根据连接器子系统开关设置选择正确的启动函数,因为GUI程序对应开关(默认)为WINDOWS(/SUBSYSTEM:WINDOWS),则连接器根据他加载WinMainCRTStartup或者wWinMainCRTStartup,而后会寻找WinMain或者wWinMain入口点函数,而且由启动函数调用。
可是,程序员写的是main函数,因而出现了” unresolved external symbol”, 或者没法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用。
如何修改?只需修改连接器子系统的开关:
main做为入口点函数的则选择:
控制台(/SUBSYSTEM:CONSOLE),
_tWinMain做为入口点函数则选择:
WINDOWS(/SUBSYSTEM:WINDOWS)。
更通用的方法是:把该开关选择为未设置,则连接器会根据入口点函数类型,选择正确的启动函数。
/*转载请注明出自 听风独奏www.GbcDbj.com */