【问题标题】:error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup错误 LNK2019:函数 ___tmainCRTStartup 中引用的未解析外部符号 _WinMain@16
【发布时间】:2021-04-18 09:58:21
【问题描述】:

当我运行下面的简单代码时,我有两个错误如下:

#include <iostream>
#include <string>
using namespace::std;

template <class Type>
class Stack
{
public:
    Stack (int max):stack(new Type[max]), top(-1), maxsize(max){}
    ~Stack (void) {delete []stack;}
    void Push (Type &val);
    void Pop (void) {if (top>=0) --top;}
    Type& Top (void) {return stack[top];}
    //friend ostream& operator<< (ostream&, Stack&);
private:
    Type *stack;
    int top;
    const int maxSize;
};

template <class Type>
void Stack <Type>:: Push (Type &val)
{
    if (top+1<maxsize)
        stack [++top]=val;
}

错误:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 in referenced in function ___tmainCRTStartup

我该怎么办?

【问题讨论】:

  • 这就是全部代码吗?你的主要功能在哪里?
  • 也好像项目类型设置错了。关于 WinMain 的链接器错误意味着您尝试创建 Win32 项目。如果您只是想要将文本输出到命令提示符,请尝试将项目类型更改为控制台。
  • 顺便说一句,如果您遇到编译器/链接器错误,您并没有“运行”代码。
  • 我尝试更改项目类型,但 project=exe 而不是控制台。

标签: c++ visual-studio visual-c++


【解决方案1】:

这是一个链接器问题。

尝试更改属性 -> 链接器 -> 系统 -> 子系统(在 Visual Studio 中)。

Windows (/SUBSYSTEM:WINDOWS)控制台 (/SUBSYSTEM:CONSOLE)

This one helped me

【讨论】:

  • 我也遇到了同样的问题。你的回答没有帮助。还有其他建议吗?
  • 我在使用 MS Visual Studio 时遇到了这个问题。如果您的环境不同,您可能必须以不同方式修复它。不过应该还是链接器的问题。
  • 如果你使用tWinMain作为你的主要功能,你必须包括tchar.h 根据是否将其更改为WinMainwWinMain您的应用程序是 Unicode。即使使用正确的子系统,如果不这样做也会产生此链接器错误。 (/SUBSYSTEM:WINDOWS)
  • 这对我有帮助,除此之外我还必须禁用 Avast 防病毒软件。
  • 这只有在我为平台和类型都选择了“所有配置”后才有效。在“解决方案”上选择“构建”会尝试构建所有内容,但第一个尝试的不是为控制台子系统指定的那个。
【解决方案2】:

正如其他人提到的,您可以将 SubSystem 更改为 Console,错误就会消失。

或者,如果您想保留 Windows 子系统,您可以提示您的入口点是什么,因为您尚未定义 ___tmainCRTStartup。您可以通过将以下内容添加到 Properties -> Linker -> Command line 来做到这一点:

/ENTRY:"mainCRTStartup"

这样你就摆脱了控制台窗口。

【讨论】:

  • +1: "这样你就摆脱了控制台窗口。" - 凉爽的!学到了。今天新!
  • +1 的建议,我试图解决这个问题大约 20 分钟,因为使用 SFML 我可以只指定子系统 Windows,使用 GLFW 显然没有那么不同,谢谢(=
【解决方案3】:

如果您遇到此问题并且正在使用 Qt - 您需要链接 qtmain.lib 或 qtmaind.lib

【讨论】:

  • 那在项目 -> 属性 -> 链接器 -> 输入。将$(QTDIR)\lib\qtmaind.lib 添加到其他依赖项。
  • CONFIG += console 添加到.pro 文件解决了我的Qt 项目的问题
【解决方案4】:

除了像其他人所说的将其更改为Console (/SUBSYSTEM:CONSOLE) 之外,您可能需要在属性-> 链接器-> 高级-> 入口点中更改入口点。将其设置为 ma​​inCRTStartup

如果您没有另外指定,Visual Studio 似乎可能正在搜索 WinMain 函数而不是 main。

【讨论】:

    【解决方案5】:

    包括&lt;tchar.h&gt;,其中有以下行:

    #define _tWinMain wWinMain
    

    【讨论】:

      【解决方案6】:

      如果您使用 Unicode 字符集,但未设置条目,则可以指定 /ENTRY:"wWinMainCRTStartup"

      【讨论】:

      • 我的救命稻草!我正在使用 cmake + mfc (unicode)
      【解决方案7】:

      如果你真的想使用 _tWinMain() 而不是 ma​​in() 确保你的项目相关配置有

      1. 链接器-> 系统-> 子系统 => Windows(/SUBSYSTEM:WINDOWS)
      2. C/C++ -> 预处理器 -> 预处理器定义 => 将 _CONSOLE 替换为 _WINDOWS
      3. 在定义_tWinMain()的c/cpp文件中,添加:

        #include &lt;Windows.h&gt; #include &lt;tchar.h&gt;

      【讨论】:

        【解决方案8】:

        我没有看到主要功能。

        请确保它具有主要功能。

        示例:

        int main(int argc, TCHAR *argv[]){
        
        }
        

        希望它运作良好。 :)

        【讨论】:

        • 这没有帮助。链接器抱怨未定义的WinMain 入口点。定义一个名为 main 的入口点并不能解决这个问题。
        • 链接器尝试解析不同的main/WinMain 版本,如果没有找到它们,它会显示 WinMain@16 not found,但此消息不是t 完全正确。
        【解决方案9】:

        如果您的项目是 Dll,则可能是链接器想要构建控制台程序。打开项目属性。选择常规设置。在那里选择配置类型动态库(.dll)。

        【讨论】:

        • 我确实遇到了这个问题,但尽管设置了 .dll 编译器仍在尝试构建 Windows 应用程序。
        【解决方案10】:

        我不确定在哪里发布我的这个答案,但我认为这是正确的地方。 我今天遇到了这个错误,切换子系统并没有改变任何事情。

        将 64 位 lib 文件更改为 32 位 (x86) 对我有用,我希望它对那里的人有所帮助!

        【讨论】:

        • 我试过这个并且成功了,尽管重新编译对相同目标的依赖项也可以。
        • 也对我有用...似乎单元测试向导使用 32 位入口点
        【解决方案11】:

        您试图将该源文件转换为可执行文件,这显然是不可能的,因为未定义强制入口点 main 函数。添加一个文件 main.cpp 并定义一个 main 函数。如果您正在使用命令行(我对此表示怀疑),您可以添加 /c 以仅编译而不链接。这只会生成一个目标文件,它需要链接到静态或共享库或应用程序(在这种情况下,您需要一个定义了 main 的 oject 文件)。

        _WinMain 是链接时main 的 Microsoft 名称。

        另外:您还没有运行代码,您正在编译(并链接)它。 C++ 不是解释型语言。

        【讨论】:

        • 实际上,他需要一个WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) 入口点。此链接器错误表明该项目是为 Windows 子系统而非控制台子系统构建的。
        • @Adam:啊,是的,我被 Qt 宠坏了 :) (它实际上对你隐藏了 WinMain)。
        • WinMain 仅适用于 Windows 应用程序。控制台应用使用不同的名称 _tmain,根据 Unicode/MBCS 设置解析为 main 或 wmain。
        • @AdamMaras,完美。我正在寻找必要的大写字母和原型。它现在完美运行。谢谢!
        • _WinMain@16 是 CRT 中的启动代码调用的用户提供的入口点的修饰符号,当针对 Windows 子系统时。这不是“链接时main 的微软名称”。如果您以控制台子系统为目标,Visual Studio 附带的 CRT 将调用名为 main 的入口点。如果未定义,链接器将抱怨缺少名为 _main 的符号。
        【解决方案12】:

        如果您使用的是 CMake,则在控制台应用程序上设置 SET(GUI_TYPE WIN32) 时也会出现此错误。

        【讨论】:

          【解决方案13】:

          上述博学的建议将解决 99.99% 的问题。我很幸运他们没有。就我而言,事实证明我包含了来自不同 Windows 项目的头文件。果然,在那个文件的最底部我找到了指令:

          #pragma comment(linker, "/subsystem:Windows")
          

          不用说,删除这条线解决了我的问题。

          【讨论】:

            猜你喜欢
            • 2014-02-03
            • 2014-02-10
            • 2011-06-18
            • 2012-06-30
            • 2015-02-06
            • 2014-08-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多