SDL2: LNK1561:入口点必须定义。

18

我想编译这段代码:

#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++项目。


2
可能是为什么SDL定义main宏?的重复问题。 - Mike Seymour
2
@MikeSeymour,这不是重复:那个线程没有包含答案。 - Dmitry
@电脑,是的,控制台。 - Dmitry
我刚开始学习C语言时也遇到了同样的错误,这个错误意味着main()有问题,在我的代码中,我将它拼错成了大写字母M的Main,纠正后错误消失了。 - razz
6个回答

44
根据 Dream.In.Code 上的 这个帖子

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

或者,如果你想隐藏控制台窗口或正在调试多线程应用程序,则应将子系统设置为 Window (/SUBSYSTEM:WINDOW)


如果您能够让 int main() 单独编译通过,请确保已经按照这里提到的检查了编译器设置,因为根据您创建项目的方式,可能意味着此设置尚未完成。这就是我的问题所在。 - ReturnVoid
1
我在补充这个答案。如果你正在调试一个SDL2应用程序,并且已经将多线程添加到该应用程序中,那么请使用“Window (/SUBSYSTEM:WINDOW)”而不是“Console (/SUBSYSTEM:CONSOLE)”。这样也可以让Visual Studio 2017成功地将其本地调试器附加到您的SDL2应用程序,从而允许您同时调试多个线程。 - tom_mai78101
没有时间编辑我的上一个评论了...你必须选择 Window (/SUBSYSTEM:WINDOW) 的原因是因为 Console (/SUBSYSTEM:CONSOLE) 只支持单线程。 - tom_mai78101

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

这是解决问题的正确方式 - @dpiron拥有良好的调试技巧。如果您的项目一开始就设置正确,那么在这个阶段您不应该需要更改链接器属性。 - user3001499
为了补充@user3001499所指的信息,你需要从win32应用程序项目开始,参见VisualC.html - jrh

4

不要 #undef main!虽然在SDL方面重新定义它是一个非常糟糕的做法,但他们有好的原因:在库方面定义了WinMain并用于运行一些初始化代码,帮助解决兼容性问题。(尤其是当使用不同的SDL实现时,如Steam或移植到其他平台如Android)

那么应该怎么做呢?在Windows上,您应该始终在SDL2.lib之前包含SDL2main.lib,并确保您的主函数格式为:

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

Source: SDL2 Windows FAQ


int main(int, char**) 也是正确的。另外,Steam 的 SDL 实现怎么样?谷歌似乎不知道它。 - HolyBlackCat
1
@HolyBlackCat https://wiki.libsdl.org/Installation#SteamOS SDL提供了一个动态加载器,而且众所周知,Steam包含了它自己的SDL副本,这与SteamOS不同。 - Gustavo Maciel
请注意,还需要创建一个 win32 应用程序项目。请参阅 VisualC.html - jrh

1
作为一个名叫tinky_winki的人所写:
右键点击项目名称 -> 属性 -> 展开链接器选项卡 -> 系统 -> 子系统:确保它是控制台 (/SUBSYSTEM:CONSOLE)
但如果你不需要一个带窗口的控制台,只需使用 /SUBSYSTEM:WINDOWS

3
谁是 tinky_winki?他们在哪里写的这个? - Stevoisiak

0

项目 >> 属性 >> 链接器 >> 高级 >> 入口点 = main,然后应用


-1
打开 sdl_main.h 文件
进行修改
#define main sdl_main

#define sdl_main main

现在它可以与简单的int main()一起工作,但这是短期解决方案的好消息。


这毫无意义。这和 #undef main 没有任何区别,只是你修改了库头文件。 - HolyBlackCat

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