Windows应用程序的VC连接器设置

Windows应用程序的VC连接器设置

      /*转载请注明出自 听风独奏 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 */

相关文章
相关标签/搜索