29

我有以下错误:

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

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

我试过:

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

没有尝试过并怀疑这些也不起作用:

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

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

4

12 回答 12

31

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

如果是 DLL,则DllMain.

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

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

main 的正确原型是

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

或者

int _tmain()

确保它是其中之一。

编辑:

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

#include <tchar.h>

如果您认为问题出在某个标题上,请使用 main() 转到文件的属性,然后在 Preprocessor 下启用预处理文件的生成。然后编译。您将获得一个具有相同名称且扩展名为 .i 的文件。打开它,看看 main() 函数是否发生了任何不愉快的事情。理论上可能有流氓#defines ...

编辑2:

定义 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可能是因为您没有更改argvto的类型_TCHAR**

如果您不打算支持 ANSI(可能不支持),您可以将您的入口点重新定义为

int wmain(int argc, wchar_t *argv[])

并删除tchar.h包含行。

于 2012-06-28T15:27:20.350 回答
6

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

为我的项目创建新配置后,我的 DLL 出现此错误。我不得不去Project Properties -> Configuration Properties -> General并改变Configuration Typeto Dynamic Library (.dll)

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

于 2014-03-11T16:58:24.670 回答
3

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

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

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

int main(int argc, char** argv)
于 2013-04-17T15:33:51.380 回答
2

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

于 2015-03-05T08:59:19.537 回答
1

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

于 2013-12-04T13:06:21.207 回答
1

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

于 2014-08-03T11:34:28.433 回答
1

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

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

这让我认为问题是在某些配置对话框的深处发现了一些微妙的设置,并且“外部“C””并没有真正解决根本问题,但表面上使事情正常进行。

于 2014-12-31T21:12:33.577 回答
0

main适用于linux和windows - 通过反复试验和其他人的帮助发现它所以无法解释它为什么有效,它只是int main(int argc, char** argv)

没有tchar.h必要

这是维基百科主函数中的相同答案

于 2013-03-08T19:33:32.360 回答
0

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

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

我有这些:

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

我只需要评论(通过前置//),这很好。

于 2015-03-19T12:13:44.183 回答
0

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

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

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

于 2015-10-03T22:59:59.997 回答
0

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

于 2016-07-19T02:24:57.047 回答
0

屏幕快照 Visual Studio 2015

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

于 2016-11-13T04:35:36.613 回答