我有以下错误LNK2019:无法parsing的外部符号_main在函数___tmainCRTStartup中引用,
有很多关于这个错误的线程,但这些解决scheme都没有为我工作。 而且,没有人解释为什么这个错误在这里。
我试过了:
没有试过,怀疑这些也不行:
为什么我得到这个错误和解决scheme是什么?
你的项目类型是什么? 如果是“Win32项目”,则入口点应该是(w)WinMain
。 如果是“Win32 Console Project”,那么它应该是(w)main
。 根据是否定义了UNICODE,名称_tmain
被定义为main
或wmain
。
如果它是一个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.h
和targetver.h
文件。
将这些文件添加回头文件 ,问题就解决了。
我有这些:
#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()
我只需要评论(通过预先计划),这是很好的。
我也曾在Visual Studio 2015中发生过这个事情,原因很有趣。 只要在这里添加它,以防万一发生在别人身上。
我已经在项目中的文件数量,我添加了另一个将有主要功能,但是当我最初添加文件,我在拼写错误(.coo而不是.cpp)。 我纠正了,但是当我完成了我得到这个错误。 事实证明,Visual Studio是聪明的,当文件被添加,它决定,它不是源文件,由于最初的扩展。
在解决方案资源管理器中右键单击文件并选择属性 – >常规 – > ItemType并将其设置为“C / C ++编译器”修复了问题。
按照以前的建议将系统设置为控制台。 只有,还必须将字符集更改为Unicode,请参阅上面的Visual Studio 2015的快照。
我以前遇到过这个问题,但是解决了。 主要的问题是我错误地拼写int main()函数。 而不是写int main()我写了int mian()….干杯!