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

标签 c++ windows visual-studio-2008 windows-7 lnk2019

我有以下错误:

LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

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

我试过了:

  • 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> - 导致引用这些 header 的函数出现级联和滚雪球错误
  • 我删除了 main.cpp 中的所有内容除了测试代码,并排除了除 main.cpp 之外的所有源文件;正如预期的那样,它是朝着正确方向迈出的一小步。问题一定出在其中一个头文件上。
  • 使用 Win32 Windows 应用程序模板(threadthread)创建新项目

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

  • 使用 int main() (不知道是什么意思,文件名还是主函数名)(thread)
  • 使用 cmake在 Windows 7 x64 上构建 (thread)

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

最佳答案

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

如果是 DLL,则 DllMain.

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

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

main 的正确原型(prototype)是

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 包含行。

关于c++ - LNK2019:函数 ___tmainCRTStartup 中引用的未解析外部符号 _main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247699/

相关文章:

visual-studio-2008 - 在 Visual Studio 中使用自定义 prolog 和 epilog 代码编写裸函数

c# - 如何测试.net web应用程序中哪个方法执行需要多长时间

c++ - C++ 中的单一错误

c++ - 将 std::vector<int> 保存到文件

java - 如何在 Windows 命令提示符下使用单个命令获取 java 版本?

c++ - Groupbox 调整大小问题,顶部有单选按钮

c++ - 如何在 visual studio 2015 构建结束时复制文件

c++ - 为什么我们可以在acceptor_.async_accept中重用移动后的socket_?

c++ - 输入法编辑器窗口为 WM_QUERYENDSESSION 返回 FALSE - 为什么?

c++ - 使用 VC++ 以编程方式从 Excel 复制单元格