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

  • 相关阅读:
    [转贴] 2016一月12日起.NET 4, 4.5 and 4.5.1 停止安全更新、技术支持 or hotfix
    Windows Azure 入门 -- VS 2015部署 ASP.NET网站(项目) 与 数据库
    [职场]工作多久才能换工作?下一个工作年薪该多高?
    [转贴] ASP.NET -- Web Service (.asmx) & JSON
    ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写Code Behind
    File 与 Log #3--动态加入控件,[图片版]访客计数器(用.txt档案来记录)
    小图示优化
    GridView的 PreRender事件与范例--GridView + CheckBox,点选多列资料(复选删除)
    [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组
    GridView的 PreRender事件与 RowCreated、RowDataBound事件大乱斗
  • 原文地址:https://www.cnblogs.com/eve612/p/13823073.html
Copyright © 2020-2023  润新知