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


143

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

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

我该怎么办?


1
这是全部代码吗?您的主要职能在哪里?
康曼

2
也看起来像项目类型设置错误。有关WinMain的链接器错误表示您尝试创建Win32项目。如果只希望将某些内容输出到命令提示符,请尝试将项目类型更改为Console。
Kilanash 2011年

4
顺便说一句,如果遇到编译器/链接器错误,则说明您不是在“运行”代码。
安德烈·卡伦

1
我尝试更改项目类型,但是project = exe代替了控制台。
Dom 2014年

Answers:


352

多数民众赞成在链接器问题。

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

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

这个帮了我


3
我有同样的问题。您的答案无济于事。还有其他建议吗?
Parth Sane

1
使用MS Visual Studio时遇到了这个问题。如果您的环境不同,则可能必须进行不同的修复。但是它仍然应该是一个链接器问题。
2014年

2
如果您tWinMain用作主要功能,则必须包含tchar.h 将其更改为,WinMain或者wWinMain取决于您的应用程序是否为Unicode。否则,即使使用正确的子系统,也会产生此链接器错误。(/ SUBSYSTEM:WINDOWS)
丽莎2015年

这不仅对我有所帮助,而且还必须禁用Avast防病毒软件。
XCS 2015年

1
只有在为平台和类型选择“所有配置”后,此方法才有效。在“解决方案”上选择“构建”会尝试全部构建,而第一个尝试不是为控制台子系统指定的。
约瑟夫·史蒂芬

83

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

或者,如果您想保留Windows子系统,则只需提示您的入口点是什么,因为您尚未定义___tmainCRTStartup。您可以通过将以下内容添加到“ 属性”->“链接器”->“命令行”中来执行此操作:

/ ENTRY:“ mainCRTStartup”

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


3
+1:“通过这种方式可以摆脱控制台窗口。” -太酷了!学到了…… 今天新!
Valentin Heinitz 2014年

1
+1的建议,我试图解决这一问题大约20分钟,因为使用SFML,我只能指定子系统Windows,而使用GLFW显然没有什么不同(谢谢
Daniel

14

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


在项目->属性->链接器->输入上。添加$(QTDIR)\lib\qtmaind.lib到其他依赖项。
mathiasfk

1
添加CONFIG += console.pro文件中解决了我的Qt项目的问题
Synck

12

除了将其更改Console (/SUBSYSTEM:CONSOLE)为其他人所说的那样,您可能还需要在“属性”->“链接器”->“高级”-> “ 入口点”中更改入口点。将其设置为mainCRTStartup

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


10

包含<tchar.h>其中的一行:

#define _tWinMain wWinMain

7

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


为我救命!我正在使用cmake + mfc(unicode)
2014年

4

我看不到主要功能。

请确保它具有主要功能。

例如:

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

}

希望它运作良好。:)


这没有帮助。链接器抱怨有一个未定义的WinMain入口点。定义一个称为的入口点main并不能解决这个问题。
IInspectable '18年

链接器尝试解析不同的main/ WinMain版本,如果找不到它们,则会显示WinMain @ 16 not found,但此消息并不完全正确。
Lorinczy Zsigmond

3

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


我有确切的问题,但是尽管.dllset编译器仍在尝试构建Windows应用。
托马什Zato -恢复莫妮卡

3

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

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


我尝试了此方法并工作了,尽管重新编译对相同目标的依赖项也可行。
Jamie Nicholl-Shelley

对我也有用...似乎单元测试向导使用32位入口点
Erik Aronesty

3

如果您实际上要使用_tWinMain()而不是main(),请 确保您的项目相关配置具有

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

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


2

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

_WinMainmain链接时Microsoft的名称。

另外:您尚未运行代码,正在编译(和链接)它。C ++不是一种解释型语言。


5
实际上,他需要一个WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)切入点。此链接器错误表明该项目是为Windows子系统而不是控制台子系统构建的。
亚当·马拉斯

@Adam:是的,我被Qt宠坏了:)(实际上对您隐藏了WinMain)。
rubenvb

WinMain仅适用于Windows应用程序。控制台应用程序使用不同的名称_tmain,它根据Unicode / MBCS设置解析为main或wmain。
史蒂夫·汤森

@AdamMaras,完美。我一直在寻找必要的大写字母和原型。现在,它可以完美运行。谢谢!
Synetech

_WinMain@16是针对Windows子系统时,由CRT中的启动代码调用的用户提供的入口点的修饰符号。它不是main链接时的Microsoft名称”。如果您以控制台子系统为目标,则Visual Studio附带的CRT将调用名为的入口点main。如果未定义,则链接器将抱怨缺少符号_main
IInspectable '18


1

上述博学的建议将在99.99%的情况下解决此问题。我没有他们是我的运气。就我而言,事实是我包含了另一个Windows项目中的头文件。果然,在该文件的最底部,我找到了指令:

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

不用说,删除此行解决了我的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.