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 */

相關文章
相關標籤/搜索