LNK2019 無法解析的外部符號 WinMain,該符號在函數 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用


這個報錯網上查了很多,大概原因是:

 

c語言運行時找不到適當的程序入口函數,

一般情況下,如果是windows程序,那么WinMain是入口函數,在VS中新建項目為“win32項目”

如果是dos控制台程序,那么main是入口函數,在VS中新建項目為“win32控制台應用程序”

而如果入口函數指定不當,很顯然c語言運行時找不到配合函數,它就會報告錯誤。

 

 

網上找到的解決方法(有點亂,建議跳過這里,直接看我寫的總結)

方法一:

[XXX屬性] -> [配置屬性] -> [鏈接器]-> [高級],在[入口點]里寫入mainCRTStartup,確定即可

 

方法二:

把應用程序類型改為控制台類型:

Go to "Linker settings -> System". Change the field "Subsystem" from "Windows" to "Console". Done.

中文版:VC左邊,解決方案窗口,在項目上點右鍵,選擇屬性->配置->鏈接->系統,將子系統的window設置成console.

 

方法三:

若是win32程序:

一是在項目屬性\CC++\預處理器\預處理器定義\里添加 _WINDOWS

一是在項目屬性\鏈接\系統 里選擇 窗口 (/SUBSYSTEM:WINDOWS)

 

若是console程序,略

 

若這兩項配置是對的,然依然有這個問題,問題在於,如果是MFC項目的話 需要在屬性\常規\MFC的使用 中 要選擇 【在靜態庫中使用MFC】

若是win32的話則選擇【使用標准windows庫】

大概這項目本來是win32工程,后來被改成mfc工程,只改了release版 debug版配置項還有這問題

 

方法四:

如果是windows程序:

1.菜單中選擇 Project->Properties, 彈出Property Pages窗口

2.在左邊欄中依次選擇:Configuration Properties->C/C++->Preprocessor,然后在右邊欄的Preprocessor Definitions對應的項中刪除_CONSOLE, 添加_WINDOWS.

3.在左邊欄中依次選擇:Configuration Properties->Linker->System,然后在右邊欄的SubSystem對應的項改為Windows(/SUBSYSTEM:WINDOWS)


如果是控制台程序:

1.菜單中選擇 Project->Properties, 彈出Property Pages窗口

2.在左邊欄中依次選擇:Configuration Properties->C/C++->Preprocessor,然后在右邊欄的Preprocessor Definitions對應的項中刪除_WINDOWS, 添加_CONSOLE.

3.在左邊欄中依次選擇:Configuration Properties->Linker->System,然后在右邊欄的SubSystem對應的項改為CONSOLE(/SUBSYSTEM:CONSOLE)

 

方法四修改圖示教程https://blog.csdn.net/luoyayun361/article/details/84403579?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param 

 

總結:

其實以上四個方法都是一個意思:

就是如果在創建項目時,選擇win32控制程序,而把代碼當win32項目寫了,即代碼里面使用WinMain()做為函數入口(主函數);

反之也一樣,創建項目時,選擇了win32項目,而把代碼當win32控制程序寫了,即代碼里面使用main()做為函數入口(主函數);

所以出現了以上報錯,意思就是主函數和當前項目不匹配。

 

我出現這種錯誤由於:

我想建一個win32控制程序,結果選了win32項目,使用就出現了后面的不愉快

 

 

 

好吧,實際不是這樣的,我犯的錯誤比這個更低級:

上面那步我是選對了(即選擇了win32控制程序),但是我下面的一步

 

 

 呃......,我就因為這次多動症,折磨了大半天。

 

上面的方法有點亂,其實方法二、三、四都是一個意思,如你純粹是上面那兩種原因出現報錯,你可以直接按方法四來,還附帶了圖解教程。

 

但是一定要注意的幾點:

1.就是把生成平台改成x64,不然還是解決不了。我也不知道為什么,因為平時不改都是可以編譯過去的,如果有高手麻煩指點一下。

 

2.如果你選了MFC項目,就按照方法三那位兄台說的:

  若這兩項配置是對的,然依然有這個問題,問題在於,如果是MFC項目的話 需要在屬性\常規\MFC的使用 中 要選擇 【在靜態庫中使用MFC】

  若是win32的話則選擇【使用標准windows庫】

  大概這項目本來是win32工程,后來被改成mfc工程,只改了release版 debug版配置項還有這問題

 

3.還有方法一的那位大神那種改法,我還沒試過,可能當上面所有都做了,還不行,不妨試試。

 

擴展:

下面附上win32控制程序、win32項目、mfc項目的區別,純粹復制粘貼,原創請原諒我忘記了你的地址,我這里就沒有標明出處。

win32控制程序和win32項目以及mfc項目區別:

空項目,大多數想單純創建c++工程的新同學,打開vs后很可能不知道選擇創建什么工程,這時候請相信我,空項目是你最好的選擇。因為空工程不包含任何的源代碼文件,接下來你只需要在相應的源代碼文件夾和頭文件文件夾加入相應的.cpp和.h文件即可。(注:對於首次使用vs的新同學來說,運行程序的時候很可能,閃一下就不見了,請不要着急,這是因為vs軟件本書沒有加上停止的代碼,我們自己動手加上就好了。每次寫程序的時候,我們需要include頭文件stdlib.h,然后在程序末尾加上system(“pause”),你會發現程序停下來了,是不是很開心。)

       接下來說一下win32控制台應用程序、win32項目、mfc項目這幾個貨的區別:

       我的理解,我首先把這幾個貨分為兩大類;第一類包括win32控制台應用程序,第二類就是剩下那倆貨。而剩下那倆貨又有一個包含關系,即win32項目包含mfc。(我個人是這個區分的。)

一、 區別:

(1)Win32控制台程序,沒有界面,只有命令符。生成的“.exe”文件直接運行操作即可。

(2)Win32項目,有界面。但是界面里面的控件,基本上要自己去實現。

(3)MFC應用程序,也有界面,但界面里的控件不需要自己去實現了,常用的控件都已經在MFC庫內寫好,直接拖動即可。

(4)控制台與Win32、MFC的交互方式不同,前者采用的是CML(命令模式,也有人說是CUI(Console user Input)),后者是GUI(用戶界面)

(5)Win32項目的界面比較符合UI界面設計;而MFC應用程序的界面基本都是一樣的,因為它們都是用同一套控件模板。

(6)Win32控制台程序:初始代碼模版以main為程序入口,默認情況下,只鏈接C++運行時庫和一些核心的win32庫,鏈接器subsystem參數為console類型,所以編譯出來的程序會有黑色的控制台窗口作為呈現標准輸入(stdin)和標准輸出(stdout)。

Win32項目:初始代碼模版實現一個簡單的windows窗口,以WinMain作為程序入口,引用了win32Api頭文件和庫,鏈接器subsystem參數為windows,所以生成的程序不帶黑色的控制台,直接使用標准輸入和標准輸出,看不到效果。

MFC應用程序:本質上是個win32工程,只是默認幫你引用了mfc框架的頭文件和庫,並且程序入口由mfc框架提供,不需要自己寫。

 

二、聯系:

         windows提供win32 api以供程序員完成各種操作,所以控制台,win32,mfc都可直接調用win32 api。但直接使用win32 api,用代碼完成諸如創建窗口,顯示窗口等操作太過繁雜,於是我們把這些代碼結合抽取出來,變成OOP中的類,也就是微軟基礎類庫(MFC)

 

三、轉換:

         因為兩大類的區別主要是定義的宏不一樣,win32 項目和mfc的為WINDOWS,win32控制台的為CONSOLE,所以:在預處理中把_WINDOWS換成_CONSOLE就行了 。  project  settings  ->  Link  :將/SUBSYSTEM:WINDOWS開關改為/SUBSYSTEM:CONSOLE  。另外, 可將  Win32控制台程序  當成  在Win32項目  使用,反之亦然。/subsystem:windows或/subsystem:console刪除,由編譯器自己決定也可以


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM