前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LNK2019 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用

LNK2019 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用

作者头像
vv彭
发布2020-10-27 11:16:56
16.6K0
发布2020-10-27 11:16:56
举报
文章被收录于专栏:c#学习笔记

这个报错网上查了很多,大概原因是:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档