LNK2019:无法parsing的外部符号_main在函数___tmainCRTStartup中引用

我有以下错误LNK2019:无法parsing的外部符号_main在函数___tmainCRTStartup中引用,

有很多关于这个错误的线程,但这些解决scheme都没有为我工作。 而且,没有人解释为什么这个错误在这里。

我试过了:

  • wWinMainCRTStartup作为链接器属性的入口点http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/14e85604-6929-4707-a22e-8cdf596926a6
  • 将链接器设置为“Windows”(与上面相同的线程)
  • 右键单击解决scheme名称 – >添加 – >现有项目 – >主文件(与上面相同的线程)
  • 包含错误LNK2019:无法parsing的外部符号_main在函数___tmainCRTStartup中引用

  • 尝试Project +属性,C / C ++,代码生成,缓冲区安全检查=否http://social.msdn.microsoft.com/Forums/hi-IN/vclanguage/thread/e2ea62c3-beb3-47a4-8963-60b799e3375a
  • 选项:C / C ++,代码生成,运行时库= / MTd; C / C ++,代码生成,基本运行时检查=默认; C / C ++,代码生成,缓冲区安全检查=否; 链接器,高级,入口点=主http://social.msdn.microsoft.com/Forums/hi-IN/vclanguage/thread/e2ea62c3-beb3-47a4-8963-60b799e3375a
  • 在main.cpp中注释掉了标题,除了'using namespace std'和#include – 导致了引用这些标题的函数级联和滚雪球错误
  • 我删除了main.cpp中除了testing代码以外的所有东西,并且排除了main.cpp以外的所有源文件; 如预期的那样工作,所以向正确的方向迈出了一小步。 该问题必须与其中一个头文件。
  • 使用Win32 Windows应用程序模板http://social.msdn.microsoft.com/Forums/ar-SA/vcgeneral/thread/105a366f-c38d-4c1c-9278-eca64589e7ca和http://social.msdn.microsoft创build新项目。 COM /论坛/ ZH / Vsexpressvc /线程/ 341780c2-162e-4b36-9402-283c0cf7c0ac

没有试过,怀疑这些也不行:

  • 使用int main()(不知道它们是什么意思,文件名或主函数名) http://social.msdn.microsoft.com/Forums/zh/Vsexpressvc/thread/341780c2-162e-4b36-9402-283c0cf7c0ac
  • 使用cmakebuild立在Windows 7 x64 http://hdf-forum.184993.n3.nabble.com/error-LNK2019-unresolved-external-symbol-main-referenced-in-function-tmainCRTStartup-td3138042.html

为什么我得到这个错误和解决scheme是什么?

你的项目类型是什么? 如果是“Win32项目”,则入口点应该是(w)WinMain 如果是“Win32 Console Project”,那么它应该是(w)main 根据是否定义了UNICODE,名称_tmain被定义为mainwmain

如果它是一个DLL,那么DllMain

项目类型可以在项目属性链接器,系统,子系统下看到。 它会说“控制台”或“Windows”。

请注意,入口点名称取决于是否定义了UNICODE。 在VS2008中,它是默认定义的。

主要的适当原型也是

 int _tmain(int argc, _TCHAR* argv[]) 

要么

 int _tmain() 

确保它是其中之一。

编辑:

如果您在_TCHAR上遇到错误,请放置一个

 #include <tchar.h> 

如果您认为问题出在其中一个标题上,请使用main()转到该文件的属性,然后在预处理器下,启用预处理文件的生成。 然后编译。 你会得到一个与.i扩展名相同的文件。 打开它,看看main()函数是否有什么不愉快的事情发生。 理论上可以有流氓#定义

EDIT2:

使用UNICODE定义(这是默认值),链接器期望入口点是wmain(),而不是main()。 _tmain具有UNICODE不可知的优点 – 它可以转换为主或者主。

前一段时间,维护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被定义为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包含行。

因为还没有提到,所以这是我的解决方案:

在为我的项目创建一个新的配置后,我有一个DLL的这个错误。 我必须去Project Properties -> Configuration Properties -> General ,并将Configuration Type更改为Dynamic Library (.dll)

所以,如果在尝试其他方法后仍然遇到问题,那么检查配置类型是否符合您对项目的期望是值得的。 如果设置不正确,编译器会查找错误的主符号。 在我的情况下,它正在寻找WinMain而不是DllMain

我得到这个错误,当我试图关闭控制台应用程序项目中的预编译头,并删除头文件stdafx.h

要解决这个问题去你的项目属性 – >链接器 – >子系统,并将值更改为未设置

在你的主类中,使用其他人已经提到的标准C ++主函数原型:

 int main(int argc, char** argv) 

如果你有一个“Win32项目”+定义了一个WinMain和你的子系统链接器设置为WINDOWS,你仍然可以得到这个链接器错误,以防有人在链接器设置中将“Additional Options”设置为“/ SUBSYSTEM:CONSOLE”像这个额外的设置比实际的子系统设置更受欢迎。

我发现,当我选择Project-> Properties-> Linker-> System-> SubSystem-> Console(/ subsystem:console),然后确保包含函数:int _tmain(int argc,_TCHAR * argv [] ){return 0}所有的编译,链接和运行都可以;

当我不小心把wmain放在命名空间里时,我有这个错误。 wmain不应该在任何命名空间。 而且,我在我使用的一个库中有一个主要的功能,而VS从那里开始了主要的功能,甚至让它变得更加陌生。

几分钟前我有这个问题。 当我将“extern”C“'添加到main()定义时,它就消失了。

奇怪的是,我昨天写的另一个简单的程序几乎是相同的,没有外部“C”,但编译没有这个链接器错误。

这让我觉得这个问题是在一些配置对话框中深入的一个微妙的设置,而“extern”C“并不真正解决底层的问题,而是表面上让事情起作用。

main在Linux和Windows的工作 – 通过反复试验和错误发现,并从别人的帮助,所以不能解释它为什么工作,它只是int main(int argc, char** argv)

不需要tchar.h

这里是维基百科主要功能相同的答案

在我的情况,这是因为我不小心删除(不删除) 头文件部分中的stdafx.htargetver.h文件。

将这些文件添加回头文件 ,问题就解决了。

我有这些:

 #pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main() 

我只需要评论(通过预先计划),这是很好的。

我也曾在Visual Studio 2015中发生过这个事情,原因很有趣。 只要在这里添加它,以防万一发生在别人身上。

我已经在项目中的文件数量,我添加了另一个将有主要功能,但是当我最初添加文件,我在拼写错误(.coo而不是.cpp)。 我纠正了,但是当我完成了我得到这个错误。 事实证明,Visual Studio是聪明的,当文件被添加,它决定,它不是源文件,由于最初的扩展。

在解决方案资源管理器中右键单击文件并选择属性 – >常规 – > ItemType并将其设置为“C / C ++编译器”修复了问题。

屏幕快照Visual Studio 2015

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

我以前遇到过这个问题,但是解决了。 主要的问题是我错误地拼写int main()函数。 而不是写int main()我写了int mian()….干杯!