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

for*_*son 27 c++ windows lnk2019 visual-studio-2008 windows-7

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

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

我试过了:

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

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

Sev*_*yev 30

你的项目类型是什么?如果它是"Win32项目",您的入口点应该是(w)WinMain.如果它是"Win32控制台项目",那么它应该是(w)main.名称_tmain是#defined,可以是main或者wmain取决于是否定义了UNICODE.

如果它是一个DLL,那么DllMain.

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

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

主要的适当原型是

int _tmain(int argc, _TCHAR* argv[])
Run Code Online (Sandbox Code Playgroud)

要么

int _tmain()
Run Code Online (Sandbox Code Playgroud)

确保它是其中之一.

编辑:

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

#include <tchar.h>
Run Code Online (Sandbox Code Playgroud)

如果您认为问题出在其中一个标题上,请使用main()转到该文件的属性,并在Preprocessor下启用生成预处理文件.然后编译.您将获得一个名为.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在某个时候得到错误的原因可能是因为你没有改变argvto 的类型_TCHAR**.

如果您不打算支持ANSI(可能不支持ANSI),您可以将您的切入点重新表述为

int wmain(int argc, wchar_t *argv[])
Run Code Online (Sandbox Code Playgroud)

并删除tchar.h包含行.

  • 如果您在_TCHAR上收到错误,请放置#include <tchar.h>另外,请参阅我的编辑. (2认同)

Diz*_*ral 6

因为还没有提到,这对我来说是解决方案:

在为我的项目创建新配置后,我遇到了DLL的错误.我不得不去Project Properties -> Configuration Properties -> General并更改Configuration TypeDynamic Library (.dll).

因此,如果您在尝试其他所有内容后仍然遇到问题,则需要检查配置类型是否符合您对项目的预期.如果设置不正确,编译器将查找错误的主符号.就我而言,它正在寻找WinMain而不是DllMain.