SDL2:LNK1561:必须定义入口点

时间:2013-09-07 10:21:47

标签: c++ c visual-c++ sdl sdl-2

我想编译这段代码:

#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添加到了Project Settings =&gt;链接器=&gt;输入

我该怎么做才能运行这个项目? VS 2012 SP3,空C ++项目。

6 个答案:

答案 0 :(得分:40)

根据Dream.In.Code上的this thread

  

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

或者,如果您想隐藏控制台窗口或debugging a multithreaded application,则应将子系统设置为Window (/SUBSYSTEM:WINDOW)

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

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

来源:SDL2 Windows FAQ

答案 3 :(得分:1)

作为 tinky_winki 写的

  

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

但如果您不希望控制台与窗口一起使用, / SUBSYSTEM:WINDOWS

答案 4 :(得分:0)

项目&gt;&gt;属性&gt;&gt;链接器&gt;&gt;高级&gt;&gt;入口点=主要 并申请

答案 5 :(得分:0)

打开 sdl_main.h

更改

#define main sdl_main

#define sdl_main main

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