我有以下错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main,
有很多线程与此错误相关,但这些解决方案都不适用于我。并且,没有人解释为什么这个错误在这里。
我试过了:
没有尝试过并怀疑这些也行不通:
为什么我会收到此错误以及解决方案是什么?
答案 0 :(得分:29)
您的项目类型是什么?如果它是“Win32项目”,您的入口点应为(w)WinMain
。如果它是“Win32控制台项目”,那么它应该是(w)main
。根据是否定义了UNICODE,名称_tmain
#defined为main
或wmain
。
如果是DLL,那么DllMain
。
项目类型可以在项目属性,链接器,系统,子系统下看到。它会说“控制台”或“Windows”。
请注意,入口点名称取决于是否定义了UNICODE。在VS2008中,它是默认定义的。
main的正确原型是
int _tmain(int argc, _TCHAR* argv[])
或
int _tmain()
确保它是其中之一。
编辑:
如果您在_TCHAR上收到错误,请放置
#include <tchar.h>
如果您认为问题出在其中一个标题上,请转到带有main()的文件属性,然后在预处理器下,启用生成预处理文件。然后编译。您将获得一个名为.i扩展名的文件。打开它,看看main()函数是否发生任何令人讨厌的事情。理论上可以有流氓#defines ......
EDIT2:
定义了UNICODE(默认值),链接器期望入口点为wmain(),而不是main()。 _tmain具有与UNICODE无关的优点 - 它可以转换为main或wmain。
前一段时间,有理由维护ANSI构建和Unicode构建。在Windows 95/98 / Me中,Unicode支持非常不完整。主要API是ANSI,并且Unicode版本存在于此处,但不是普遍存在的。此外,VS调试器在显示Unicode字符串时遇到问题。在NT内核操作系统(即Windows 2000 / XP / Vista / 7/8/10)中,Unicode支持是主要的,并且ANSI功能被添加到顶部。因此,自VS2005以来,项目创建时的默认值是Unicode。这意味着 - wmain。它们无法保持相同的入口点名称,因为参数类型不同。 _TCHAR #defined为char或wchar_t。所以_tmain要么是main(int argc,char ** argv)要么是wmain(int argc,wchar_t ** argv)。
您在_tmain
处遇到错误的原因可能是因为您没有将argv
的类型更改为_TCHAR**
。
如果您不打算支持ANSI(可能不支持),您可以重新制定入口点
int wmain(int argc, wchar_t *argv[])
并删除tchar.h
包含行。
答案 1 :(得分:6)
因为还没有提到,这对我来说是解决方案:
在为项目创建新配置后,我遇到了DLL的错误。我必须转到Project Properties -> Configuration Properties -> General
并将Configuration Type
更改为Dynamic Library (.dll)
。
因此,如果您在尝试其他所有内容后仍然遇到问题,则需要检查配置类型是否符合您对项目的预期。如果设置不正确,编译器将查找错误的主符号。就我而言,它正在寻找WinMain
而不是DllMain
。
答案 2 :(得分:3)
我在尝试关闭控制台应用程序项目中的预编译头文件并删除头文件stdafx.h时出现此错误
要解决此问题,请转到您的项目属性 - &gt;链接器 - &gt;子系统 并将值更改为未设置
在您的主类中,使用其他人已经提到的标准C ++主函数原型:
int main(int argc, char** argv)
答案 3 :(得分:2)
如果你有一个&#34; Win32项目&#34; +定义了一个WinMain并且你的SubSystem链接器设置被设置为WINDOWS你仍然可以得到这个链接器错误,以防有人设置&#34;附加选项&#34;在链接器设置中&#34; / SUBSYSTEM:CONSOLE&#34; (看起来这个附加设置优于实际的SubSystem设置。
答案 4 :(得分:1)
我发现当我选择的时候 项目 - &GT;属性 - &GT;链接器&GT;系统 - &GT;&于子系统GT;控制台(/子系统:控制台), 然后确保包含 功能 : int _tmain(int argc,_TCHAR * argv []){return 0} 所有的编译,链接和运行都可以;
答案 5 :(得分:1)
我在意外地将wmain放入命名空间时出现此错误。 wmain不应该在任何名称空间中。此外,我在我使用的其中一个库中有一个主要功能,VS从那里取得了主要功能,这让它更加奇怪。
答案 6 :(得分:1)
几分钟前我遇到了这个问题。当我添加&#34;外部&#34; C&#34;&#39;到main()定义。
奇怪的是,我昨天写的另一个简单的程序几乎是相同的,没有extern&#34; C&#34;,但编译没有这个链接器错误。
这让我觉得问题是在一些配置对话框中可以找到的一些微妙的设置,并且&#34; extern&#34; C&#34;&#39;并没有真正解决潜在的问题,但表面上看起来很有效。
答案 7 :(得分:0)
此main
适用于Linux和Windows - 通过反复试验和其他人的帮助找到它,因此无法解释其工作原理,只是int main(int argc, char** argv)
不需要tchar.h
以及维基百科Main function
中的答案相同答案 8 :(得分:0)
在我的情况下,这是因为我不小心删除了(未删除)页眉文件部分中的stdafx.h
和targetver.h
文件。< /德尔>
将这些文件添加回标题文件,问题就解决了。
我有这些:
#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()
我只需要评论一下(通过预先//
)并且它很好。
答案 9 :(得分:0)
我在Visual Studio 2015中也出现了这个有趣的原因。只需将其添加到此处以防万一发生在其他人身上。
我已经在项目中有多个文件,我正在添加另一个具有主要功能的文件,但是当我最初添加文件时,我在扩展名中输入了一个拼写错误(.coo而不是.cpp)。我纠正了这一点但是当我完成时我得到了这个错误。事实证明,Visual Studio很聪明,当文件被添加时,由于初始扩展,它决定它不是源文件。
右键单击解决方案资源管理器中的文件,然后选择“属性” - >一般 - &gt; ItemType并将其设置为“C / C ++编译器”修复了问题。
答案 10 :(得分:0)
之前我遇到过这个问题,但它已经解决了。主要问题是我错误地拼写了int main()函数。而不是写int main()我写了int mian()....干杯!
答案 11 :(得分:0)