LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main

时间:2012-06-28 15:16:26

标签: c++ windows visual-studio-2008 windows-7 lnk2019

我有以下错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main,

有很多线程与此错误相关,但这些解决方案都不适用于我。并且,没有人解释为什么这个错误在这里。

我试过了:

没有尝试过并怀疑这些也行不通:

为什么我会收到此错误以及解决方案是什么?

12 个答案:

答案 0 :(得分:29)

您的项目类型是什么?如果它是“Win32项目”,您的入口点应为(w)WinMain。如果它是“Win32控制台项目”,那么它应该是(w)main。根据是否定义了UNICODE,名称_tmain #defined为mainwmain

如果是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.htargetver.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)

Screen snapshot Visual Studio 2015

按照之前的建议将系统设置为控制台。只有,还必须将字符集更改为Unicode,请参阅上面的Visual Studio 2015快照。