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

我有以下错误:

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 应用程序模板创建新项目( 线程线程

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

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

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

原文由 forest.peterson 发布,翻译遵循 CC BY-SA 4.0 许可协议
阅读 1.1k
2 个回答

你的项目类型是什么?如果它是“Win32 项目”,您的入口点应该是 (w)WinMain 。如果它是“Win32 控制台项目”,那么它应该是 (w)main 。名称 _tmain 被定义为 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 …

编辑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(可能不支持),您可以将您的入口点重新定义为

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

并删除 tchar.h 包含行。

原文由 Seva Alekseyev 发布,翻译遵循 CC BY-SA 3.0 许可协议

屏幕快照 Visual Studio 2015

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

原文由 LastBlow 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题