/*轉載請註明出自 聽風獨奏 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 */