【问题标题】:LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartupLNK2019:未解析的外部符号 _main 在函数 ___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 应用程序模板创建新项目(threadthread

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

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

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

【问题讨论】:

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

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


【解决方案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

                【讨论】:

                  猜你喜欢
                  • 2011-06-18
                  • 2014-09-23
                  • 2015-02-06
                  • 2014-08-28
                  • 2013-08-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-10
                  相关资源
                  最近更新 更多