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

Posted

技术标签:

【中文标题】LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用【英文标题】:LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup 【发布时间】:2012-06-30 03:41:13 【问题描述】:

我有以下错误:

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

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

我试过了:

wWinMainCRTStartup 作为链接器属性中的入口点 (thread) 将链接器设置为“Windows”(与上述相同的线程) 右键单击解决方案名称->添加->现有项目->带有主文件的文件(与上述相同的线程) #include <tchar.h> (error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup) 尝试项目 + 属性、C/C++、代码生成、缓冲区安全检查 = 否 (thread) 选项:C/C++、代码生成、运行时库=/MTd; C/C++,代码生成,基本运行时检查=默认; C/C++,代码生成,缓冲区安全检查=否;链接器,高级,入口点=main (thread) 注释掉 main.cpp 中的标头,using namespace std#include <iostream> 除外 - 导致引用这些标头的函数出现级联和滚雪球错误 我删除了main.cpp中除测试代码外的所有内容,并排除了除main.cpp之外的所有源文件;正如预期的那样,它是朝着正确方向迈出的一小步。问题一定出在其中一个头文件上。 使用 Win32 Windows 应用程序模板创建新项目(thread 和 thread)

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

使用int main()(不确定它们的意思,文件名或主函数名)(thread) 使用cmake 在 Windows 7 x64 上构建 (thread)

为什么会出现这个错误,解决方法是什么?

【问题讨论】:

你有int main(char** argv, int argc)函数吗? @Linuxios,它是“int main(int argc, char** argv)”(您的原型中的顺序错误) @BlakBat:谢谢。对不起。无论如何,我什至不在 Windows 上工作,但这是无处不在的签名。呵呵。 【参考方案1】:

按照前面的建议将系统设置为控制台。只是,还得把字符集改成 Unicode,见上面 Visual Studio 2015 的截图。

【讨论】:

【参考方案2】:

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

【讨论】:

这个答案对你自己来说太具体了。由于main 在 OP 的问题中的任何地方都没有拼写错误,因此没有理由认为这是问题所在。 OP 没有显示任何源代码,他只是说明了错误。我今天也遇到了同样的错误,但后来意识到我拼错了main这个词,所以在更正之后错误消失了..【参考方案3】:

出于一个有趣的原因,我在 Visual Studio 2015 中也发生了这种情况。只需将其添加到此处,以防万一发生在其他人身上。

我已经在项目中有很多文件,并且我正在添加另一个具有主要功能的文件,但是当我最初添加文件时,我在扩展名中输入了一个错字(.coo 而不是 .cpp)。我纠正了这一点,但是当我完成时,我得到了这个错误。事实证明,Visual Studio 很聪明,当添加文件时,由于初始扩展名,它决定它不是源文件。

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

【讨论】:

【参考方案4】:

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

如果是 DLL,则为DllMain

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

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

main 的正确原型是

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

int _tmain()

确保它是其中之一。

编辑:

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

#include <tchar.h>

如果您认为问题出在某个标题上,请使用 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 #定义为 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 包含行。

【讨论】:

我尝试将 int main() 更改为 int _tmain() 仍然出现 lnk2019 错误 int _tmain(int argc, _TCHAR* argv[]) 导致错误 C2061:语法错误:标识符 '_TCHAR';我尝试了 int main(int argc, char** argv) 的变体,它返回了初始 lnk2019 错误 如果我删除除#include 之外的所有标题并注释掉除测试文本行之外的所有标题,然后编译,因此问题似乎出在其中一个头文件中- 追踪导致 lnk2019 主要错误的标头问题的过程是什么 如果您在 _TCHAR 上遇到错误,请放置 #include 另外,请参阅我的编辑。 那行得通。我没有与我引用的一些线程中给出的#include 和 int _tmain(int argc, _TCHAR* argv[]); 建立联系。你能解释一下功能上发生了什么 - int main() 出了什么问题,为什么还有这些其他的东西?【参考方案5】:

就我而言,这是因为我不小心删除了(未删除)Header Files 部分中的stdafx.htargetver.h 文件。

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

我有这些:

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

我只需要评论一下(通过添加//)就可以了。

【讨论】:

【参考方案6】:

如果您有一个“Win32 项目”+ 定义了一个 WinMain 并且您的子系统链接器设置设置为 WINDOWS,如果有人将链接器设置中的“附加选项”设置为“/SUBSYSTEM:CONSOLE”,您仍然会收到此链接器错误"(看起来这个附加设置优于实际的子系统设置。

【讨论】:

【参考方案7】:

几分钟前我遇到了这个问题。当我在 main() 定义中添加 'extern "C"' 时,它就消失了。

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

这让我觉得问题出在某些配置对话框深处的一些微妙设置,而“extern "C"”并没有真正解决根本问题,但表面上使事情正常进行。

【讨论】:

【参考方案8】:

当我不小心将 wmain 放入命名空间时,我遇到了这个错误。 wmain 不应位于任何命名空间中。此外,我正在使用的一个库中有一个 main 函数,而 VS 从那里获取了 main 函数,这让它变得更加陌生。

【讨论】:

我敢打赌这是很多情况下的问题。【参考方案9】:

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

在为我的项目创建新配置后,我的 DLL 出现此错误。我必须去Project Properties -&gt; Configuration Properties -&gt; General 并将Configuration Type 更改为Dynamic Library (.dll)

因此,如果您在尝试了所有其他方法后仍然遇到问题,则值得检查一下配置类型是否符合您对项目的期望。如果设置不正确,编译器将寻找错误的主符号。就我而言,它正在寻找WinMain 而不是DllMain

【讨论】:

【参考方案10】:

我发现当我选择 项目->属性->链接器->系统->子系统->控制台(/subsystem:console), 然后确保包括 功能 : int _tmain(int argc,_TCHAR* argv[])return 0 所有的编译,链接和运行都可以;

【讨论】:

确保包含 tchar.h 这对我也有用。事实上,当子系统“未设置”时它也可以工作。【参考方案11】:

我在尝试关闭控制台应用程序项目中的预编译头文件并删除头文件 stdafx.h 时遇到此错误

要解决此问题,请转到您的项目属性 -> 链接器 -> 子系统 并将值更改为 Not Set

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

int main(int argc, char** argv)

【讨论】:

【参考方案12】:

这个 main 在 linux 和 windows 中都可以工作 - 通过反复试验和其他人的帮助找到它,所以无法解释它为什么工作,它只是 int main(int argc, char** argv)

不需要tchar.h

这是***中相同的答案Main function

【讨论】:

以上是关于LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用的主要内容,如果未能解决你的问题,请参考以下文章

错误 LNK2019:未解析的外部符号 opencv

glCubicRayCast.obj : error LNK2019: 无法解析的外部符号 __imp__glewInit,该符号在函数 _main中被引用

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号 求解答..