error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
当我运行下面的简单代码时,有两个错误,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #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 referenced in function ___tmainCRTStartup
我该怎么办?
- 这些都是密码吗?你的主要职能在哪里?
- 看起来项目类型设置错误。有关winmain的链接器错误意味着您试图创建win32项目。如果您只想将文本输出到命令提示符,请尝试将项目类型更改为console。
- 顺便说一下,如果您遇到编译器/链接器错误,您就不会"运行"代码。
- 我尝试更改项目类型,但是project=exe工作而不是控制台。
这是一个链接器问题。
尝试更改属性->链接器->系统->子系统(在Visual Studio中)。
从Windows(/subsystem:windows)到控制台(/subsystem:console)
这个帮了我
- 我也有同样的问题。你的回答没有帮助。还有其他建议吗?
- 我在使用MS Visual Studio时遇到了这个问题。如果您的环境不同,您可能需要以不同的方式修复它。但这仍然是一个链接器问题。
- 如果您使用tWinMain作为主要功能,则必须包含tchar.h或将其更改为WinMain或wWinMain,具体取决于您的应用程序是否为Unicode。如果不这样做,即使使用正确的子系统,也会导致链接器错误。(/子系统:Windows)
- 这解决了我的问题,非常感谢你的提示!
- 这对我有帮助,除此之外,我还必须禁用avast反病毒。
- 这个解决方案对我非常有效!
- 记住不要只将subsystem:windows更改为subsystem:console。但整件事,我忘了在括号前把窗口改成控制台。
- 对于任何关心原因的人,请参阅:stackoverflow.com/questions/7316433/&hellip;
- 你真的救了我的命,我在那个问题上被困了一个小时!谢谢!!!!
正如其他人提到的,您可以将子系统更改为控制台,错误将消失。
或者,如果您想保留Windows子系统,您只需提示您的入口点是什么,因为您还没有定义___tmainCRTStartup。您可以通过将以下内容添加到属性->链接器->命令行来完成此操作:
/ENTRY:"mainCRTStartup"
这样就摆脱了控制台窗口。
- +1:"这样你就摆脱了控制台窗口。"-酷!今天学到了新东西!
- +1为了得到建议,我花了大约20分钟的时间来解决这个问题,因为使用sfml,我可以指定子系统窗口,使用glfw,这显然不同,所以谢谢。(=
- 完美的THX(我把它放在其他选项中)。
如果您遇到此问题并且正在使用qt-您需要链接qtmain.lib或qtmaind.lib
- 在project->properties->linker->input上。将$(QTDIR)\lib\qtmaind.lib添加到其他依赖项。
包括,该行有:
1
| #define _tWinMain wWinMain |
除了像其他人所说的那样将其更改为Console (/SUBSYSTEM:CONSOLE),您可能还需要在properties->linker->advanced->entry point中更改入口点。将其设置为maincrt启动。
如果不另外指定,Visual Studio似乎正在搜索winmain函数而不是main。
如果使用的是Unicode字符集,但未设置该项,则可以指定/entry:"wwInIncrtStartup"
- 我的救命稻草!我使用的是cmake+mfc(unicode)
- 这就成功了!
我看不到主要功能。
请确保它具有主要功能。
例子:
1 2 3
| int main(int argc, TCHAR *argv[]){
} |
希望它能很好地工作。:)
- 这没用。链接器正在抱怨未定义的winmain入口点。定义一个名为main的入口点并不能解决这个问题。
- 链接器试图解析不同的main/WinMain版本,如果找不到,它会说winmain@16找不到,但这个消息并不完全正确。
如果您的项目是dll,那么情况可能是链接器想要构建一个控制台程序。打开项目属性。选择常规设置。在那里选择配置类型动态库(.dll)。
- 我确实有这个问题,但是虽然.dll是设置好的,编译器仍在尝试构建Windows应用程序。
我不知道在哪里张贴我的答案,但我认为这是正确的地方。我今天遇到了这个错误,切换子系统并没有改变什么。
把64位lib文件改成32位(x86)对我来说是个小把戏,我希望它能帮上忙!
- 这对我有用!
- 我尝试了这个方法并进行了工作,尽管对相同目标的依赖关系的重新编译也有效。
- 也为我工作…似乎单元测试向导使用了32位入口点
您试图将源文件转换为可执行文件,这显然是不可能的,因为没有定义强制入口点main函数。添加文件main.cpp并定义主函数。如果您使用的是命令行(我对此表示怀疑),那么您可以添加/c来只编译而不链接。这将只生成一个对象文件,该文件需要链接到静态或共享库或应用程序(在这种情况下,您需要一个定义了main的项目文件)。
_WinMain是微软链接时main的名称。
另外:您还没有运行代码,您正在编译(和链接)代码。C++不是一种解释性语言。
- 实际上,他需要一个WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)入口点。此链接器错误指示正在为Windows子系统而不是控制台子系统生成项目。
- @亚当:啊,是的,我被qt:)宠坏了(这实际上把winmain藏起来了)。
- WinMain仅适用于Windows应用程序。控制台应用程序使用不同的名称tmain,根据unicode/mbcs设置解析为main或wmain。
- @阿达玛拉斯,完美。我在寻找必要的资本和原型。它现在工作得很好。谢谢!
- _WinMain@16是CRT中启动代码调用的用户提供的入口点的修饰符号,当面向Windows子系统时。它不是"微软链接时的main"。如果目标是控制台子系统,则随Visual Studio一起提供的CRT将调用名为main的入口点。如果未定义,链接器将抱怨缺少名为_main的符号。
如果您使用的是cmake,那么在控制台应用程序上设置SET(GUI_TYPE WIN32)时也会出现此错误。
如果您确实想使用_twinmain()而不是main()。确保与项目相关的配置
链接器->系统->子系统=>Windows(/subsystem:windows)
C/C++->预处理器->预处理器定义= >用窗口替换控制台
在定义了_twinmain()的c/cpp文件中,添加:
#include #include