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删除,由编译器自己决定也可以

posted @ 2020-10-15 20:48  vv彭  阅读(8971)  评论(0编辑  收藏  举报