我有以下错误:
LNK2019:函数 ___tmainCRTStartup 中引用的未解析外部符号 _main
有很多与此错误相关的线程,但这些解决方案都不适合我。而且,没有人解释为什么会出现这个错误。
我试过了:
wWinMainCRTStartup
作为链接器属性中的入口点( 线程)- 将链接器设置为“Windows”(与上述相同的线程)
- 右键单击解决方案名称->添加->现有项目->带有主文件的文件(与上述相同的线程)
#include <tchar.h>
( 错误LNK2019:未解析的外部符号_main在函数___tmainCRTStartup中引用)- 尝试项目 + 属性、C/C++、代码生成、缓冲区安全检查 = 否( 线程)
- 选项:C/C++、代码生成、运行库=/MTd; C/C++,代码生成,基本运行时检查=默认; C/C++,代码生成,缓冲区安全检查=否;链接器,高级,入口点=主( 线程)
- 注释掉
main.cpp
中的标题,除了using namespace std
和#include <iostream>
导致引用这些标题的函数出现级联和滚雪球错误 - 我删除了
main.cpp
除了测试代码之外的所有内容,并排除了除main.cpp
之外的所有源文件;正如预期的那样,它是朝着正确方向迈出的一小步。问题一定出在其中一个头文件上。 - 使用 Win32 Windows 应用程序模板创建新项目( 线程 和 线程)
没有尝试过并怀疑这些也不起作用:
为什么我会收到此错误,解决方案是什么?
原文由 forest.peterson 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的项目类型是什么?如果它是“Win32 项目”,您的入口点应该是
(w)WinMain
。如果它是“Win32 控制台项目”,那么它应该是(w)main
。名称_tmain
被定义为main
或wmain
取决于是否定义了 UNICODE。如果是 DLL,则
DllMain
。项目类型可以在项目属性、链接器、系统、子系统下看到。它会说“控制台”或“Windows”。
请注意,入口点名称取决于是否定义了 UNICODE。在 VS2008 中,它是默认定义的。
main 的正确原型是
或者
确保它是其中之一。
编辑:
如果您在 _TCHAR 上遇到错误,请放置一个
如果您认为问题出在其中一个标题上,请使用 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
有时出现错误的原因可能是因为您没有将argv
的类型更改为_TCHAR**
。如果您不打算支持 ANSI(可能不支持),您可以将您的入口点重新定义为
并删除
tchar.h
包含行。