错误 LNK2019: 未解析的外部符号 _WinMain@16 在函数 ___tmainCRTStartup 中被引用。

162

当我运行以下简单代码时,出现两个以下错误:

#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):错误 LNK2019:在函数 ___tmainCRTStartup 中引用了未解析的外部符号 _WinMain@16

我该怎么办?


1
这是全部的代码吗?你的主函数在哪里? - Connman
4
似乎项目类型设置错误了。关于WinMain的链接器错误意味着您尝试创建Win32项目。如果您只想要输出文本到命令提示符,请尝试将项目类型更改为控制台。 - Kilanash
4
顺便说一下,如果你遇到编译器/链接器错误,那么你并没有在"运行"代码。 - André Caron
1
我尝试更改项目类型,但是project=exe而不是console。 - Heather
13个回答

399

这是一个链接器问题。

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

Windows (/SUBSYSTEM:WINDOWS) 更改为 Console (/SUBSYSTEM:CONSOLE)

这篇文章帮助了我


4
我也遇到了同样的问题。你的回答没有帮助我。还有其他建议吗? - Parth Sane
1
我在使用MS Visual Studio时遇到了这个问题。如果您的环境不同,您可能需要以不同的方式解决它。但它仍然应该是一个链接器问题。 - Bohdan
3
如果您使用 tWinMain 作为主函数,必须包含 tchar.h ,或者根据您的应用程序是否为 Unicode,将其更改为 WinMainwWinMain。如果不这样做,即使子系统设置正确,也会导致此链接器错误。(/SUBSYSTEM:WINDOWS)。 - lisa
你真的救了我的命,我在那个问题上卡了一个小时!!谢谢!!! - Myriam Sarah
1
只有在我选择了平台和类型的“所有配置”后,这才起作用。在“解决方案”中选择“构建”尝试构建所有内容,并且首先尝试构建的不是我指定为控制台子系统的那个。 - Joseph Stateson
显示剩余5条评论

91

如其他人所提到的那样,您可以将子系统更改为Console,错误就会消失。

或者,如果您想保留Windows子系统,只需指示您的入口点即可,因为您尚未定义___tmainCRTStartup。 您可以通过在“属性 -> 链接器 -> 命令行”中添加以下内容来实现此目的:

/ENTRY:“mainCRTStartup”

这样,您就可以摆脱控制台窗口。


3
这样你就可以摆脱控制台窗口了。 - 酷!今天学到了新东西! - Valentin H
1
谢谢你的建议,我一直在尝试解决这个问题大约20分钟了。因为使用SFML时,我只需要指定Windows子系统,但是使用GLFW显然不同,所以非常感谢你的帮助。 (= - daniel

15
除了像其他人所说的那样将它改为Console(/SUBSYSTEM:CONSOLE),您可能还需要在“属性”->“链接器”->“高级”->“入口点”中更改入口点。将其设置为mainCRTStartup
如果不另外指定,似乎Visual Studio可能会搜索WinMain函数而不是main函数。

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

这是在项目 -> 属性 -> 链接器 -> 输入中设置的。 添加 $(QTDIR)\lib\qtmaind.lib 到附加依赖项。 - mathiasfk
1
CONFIG += console 添加到 .pro 文件中,解决了我的 Qt 项目问题。 - Synck
请注意,在QT6中,qtmain.lib已经不存在了。因此,您必须使用“Morten Kristensen”的答案来解决这个问题。 - jpo38

10

包含<tchar.h>,其中有以下代码行:

#define _tWinMain wWinMain

8
如果您使用Unicode字符集,但未设置输入,则可以指定/ENTRY:“wWinMainCRTStartup”。

对我来说真是救命稻草!我一直在使用cmake + mfc(unicode)。 - malat

5

如果您想要使用 _tWinMain() 而不是 main(),请确保您的项目相关配置具有以下内容:

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

    #include <Windows.h> #include <tchar.h>


4

我看不到主函数。

请确保它有主函数。

例子:

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

}

我希望它能够良好运作。 :)

1
这并没有帮助。链接器抱怨缺少未定义的WinMain入口点。定义一个名为main的入口点对解决这个问题没有任何作用。 - IInspectable
链接器尝试解析不同的 main/WinMain 版本,如果没有找到任何一个版本,则会显示“_WinMain@16未找到_”的消息,但这个消息并不完全正确。 - Lorinczy Zsigmond

4
如果你的项目是一个Dll,那么问题可能是链接器想要构建一个控制台程序。打开项目属性,选择常规设置,选择配置类型动态库(.dll)。请注意不要删除html标签。

我也遇到了这个问题,尽管.dll已经设置好了,编译器仍然试图构建Windows应用程序。 - Tomáš Zato

3

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

将64位lib文件更改为32位(x86)对我有用,希望能够帮助到其他人!


我尝试了这个方法,它有效了,虽然重新编译依赖项到相同的目标也可以。 - Jamie Nicholl-Shelley
也适用于我...看起来单元测试向导使用32位入口点。 - Erik Aronesty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接