SDL2:LNK1561:必须定义入口点

Posted

技术标签:

【中文标题】SDL2:LNK1561:必须定义入口点【英文标题】:SDL2: LNK1561: entry point must be defined 【发布时间】:2013-09-11 09:52:33 【问题描述】:

我要编译这段代码:

#include <SDL.h>

int main(int argc, char* argv[]) 
    return 0;

但无法链接:Error 1 error LNK1561: entry point must be defined

这个库中有一些奇怪的代码:http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main    SDL_main

我还添加了SDL2.lib;SDL2main.lib 到项目设置 => 链接器 => 输入。

我可以做些什么来运行这个项目? VS 2012 SP3,空 C++ 项目。

【问题讨论】:

Why SDL defines main macro?的可能重复 @MikeSeymour,这不是重复的:该线程不包含答案。 @computer,是的,控制台。 我刚开始学习c,遇到了同样的错误,这个错误意味着main()不正确,在我的代码中我把它拼错为Main,大写m,在纠正错误后消失了。 【参考方案1】:

根据 Dream.In.Code 上的this thread:

右键项目名称->属性->展开链接器选项卡->系统->子系统:确保是Console (/SUBSYSTEM:CONSOLE)

或者,如果你想隐藏控制台窗口或者是debugging a multithreaded application,你应该将SubSystem设置为Window (/SUBSYSTEM:WINDOW)

【讨论】:

补充说,如果你可以让 int main() 自行编译,那么请确保你已经检查了这里提到的编译器设置,这取决于你创建项目的方式可能意味着此设置尚未为您完成。就像我的问题一样。 我正在添加到这个答案。如果您正在调试 SDL2 应用程序,并且您已将多线程添加到所述应用程序,而不是使用 Console (/SUBSYSTEM:CONSOLE),请使用 Window (/SUBSYSTEM:WINDOW)。这也应该让 Visual Studio 2017 将其本地调试器成功附加到您的 SDL2 应用程序,从而允许您同时调试多个线程。 没有时间编辑我的最后一条评论...您必须使用Window (/SUBSYSTEM:WINDOW) 的原因是因为Console (/SUBSYSTEM:CONSOLE) 仅是单线程的。【参考方案2】:

我发现设置 /SUBSYSTEM:CONSOLE 只是解决方案的一半。后半部分是将SDL_MAIN_HANDLED 添加到您的附加定义中。我用来解决这个问题的线索可以在 SDL_main.h 中找到。设置SDL_MAIN_HANDLED 告诉SDL 头文件您已经提供了main 函数并且不希望它重新定义自己的入口点。

【讨论】:

这是解决这个问题的正确方法-良好的调试技巧@dpiron。如果您的项目一开始就设置正确,则在此阶段不需要更改链接器属性 要向@user3001499 所指的内容添加更多信息,您需要从一个win32 应用程序项目开始,参见VisualC.html【参考方案3】:

不要#undef main!虽然在 SDL 方面重新定义它是一个非常糟糕的做法,但他们有充分的理由:WinMain 是在库方面定义的,用于运行一些初始化代码,有助于解决兼容性问题。 (在使用不同的 SDL 实现时更是如此,例如 Steam 或移植到其他平台,例如 android

那你该怎么办?在 Windows 上,您应该始终在 SDL2.lib 之前包含 SDL2main.lib,并确保您的 main 格式为:

int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT

来源:SDL2 Windows FAQ

【讨论】:

int main(int, char**) 也是正确的。另外,Steam SDL 的实施情况如何? Google 似乎对此一无所知。 @HolyBlackCat wiki.libsdl.org/Installation#SteamOS SDL 提供动态加载器,并且已知 Steam 包含它自己的 SDL 副本,这与 SteamOS 不同 请注意,还需要创建一个win32 应用程序项目。见VisualC.html。【参考方案4】:

正如一个tinky_winki所写

项目名称右键->属性->展开链接器选项卡-> 系统 -> 子系统:确保它是控制台 (/SUBSYSTEM:CONSOLE)

但如果你不希望控制台简单地使用窗口,/SUBSYSTEM:WINDOWS

【讨论】:

谁是tinky_winki?他们在哪里写的?【参考方案5】:

项目>>属性>>链接器>>高级>>入口点=主 并申请

【讨论】:

【参考方案6】:

打开 sdl_main.h

改变

#define main sdl_main

#define sdl_main main

现在它可以与简单的 int main() 一起使用,但这对于短期解决方案来说很糟糕

【讨论】:

这是零意义。它与#undef main 没有什么不同,只是你正在修改库头。

以上是关于SDL2:LNK1561:必须定义入口点的主要内容,如果未能解决你的问题,请参考以下文章

简单程序的“必须定义LNK1561入口点”

错误:链接:致命错误 LNK1561:入口点必须定义 C++

致命错误 LNK1561:必须定义入口点

MFC项目中:报错:“fatal error LNK1561: 必须定义入口点”解决方法

“fatal error LNK1561: 必须定义入口点”解决方法

链接:致命错误LNK1561:入口点必须定义VS2015开发者cmd窗口