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

4

6 回答 6

44

根据Dream.In.Code上的这个线程:

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

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

于 2013-09-07T10:40:39.090 回答
7

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

于 2016-12-13T03:39:06.833 回答
4

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

那你该怎么办?在 Windows 上时,您应该始终包括SDL2main.libbeforeSDL2.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 常见问题解答

于 2017-07-13T02:46:18.770 回答
1

正如tinky_winki所写

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

但是,如果您不希望控制台带有窗口,只需使用/SUBSYSTEM:WINDOWS

于 2015-07-01T17:07:57.970 回答
0

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

于 2018-05-09T21:40:32.373 回答
-1

打开sdl_main.h

改变

#define main sdl_main

#define sdl_main main

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

于 2020-04-17T01:24:01.560 回答