对 WinMain@16 C++、SDL-2 的未定义引用

undefined reference to WinMain@16 C++, SDL-2

我收到错误 undefined reference to WinMain@16。保存space,here's a link to all the files currently in the project。目前,除了创建一个 window,将其填充为绿色,然后在角落绘制一个框外,它不应该做太多事情,同时通过控制台跟踪鼠标的位置。但是,它无法构建,并且出现上述错误。

我的 linker 图书馆是:

我正在使用 Codeblocks 13.12 和 g++,遵循 C++11 ISO C++ 语言标准。我的电脑正在使用 windows 10 以防相关。

我花了很长时间试图找到一个解决方案,似乎每个人都有一个完全不同的解决方案,到目前为止 none 对我有用。一些示例包括:

我还应该指出用户提供的答案,干杯和hth。 - Alf,here 可能是我要找的东西,但老实说,我不能完全理解基于它我应该做什么。

如果有任何相关信息我忘记包含,请告诉我,我会尽快这样做。提前致谢。

我想你想要

#define SDL_MAIN_HANDLED

在你的主文件中,行

之前
#include <SDL2/SDL.h>

解释:

在 SDL/SDL2 中,为了尝试cross-platform 简化某些类型应用程序的开发,SDL 为您的应用程序创建了自定义 "entry-point"。也就是说,你的int main()不是真正的主。发生的情况是,main 在 SDL header 中被定义为一个宏,这会导致您的 main 重命名为 SDL_main 或类似名称。然后,在 "SDL_main" 库中定义了一个不同的 main,这将是您应用程序的真正 main。这个 main 只是以适合平台的任何方式获取 command-line 参数,并调用你的 main(已重命名为 SDL_main)。

在 windows,关于您的应用程序是作为控制台程序启动还是作为 gui 程序启动,也存在一些差异,iiuc。

有时您希望 SDL 为您做这些事情,但如果您正在开发传统的控制台程序,通常您不会这样做。所以你传递 SDL 这个 SDL_MAIN_HANDLED 定义是为了防止做所有这些事情。

#undef main 方法也可以,但效果不是很好,因为通过这种方式,您告诉 SDL 发生了什么,而使用另一种方法,SDL 认为它的所有内容都将被使用事实上,你后来用 #undef 粗暴地禁用了它。

如果您想查看各种宏/平台检查的详细信息,可以查看 SDL_main.h header。想知道SDL主系统有什么好处,可以看看SDL文档

接受的答案中建议的解决方案(未定义 main、定义 SDL_MAIN_HANDLED 等等)偏离了 SDL2 的预期使用方式。预期的方法是否合理是另一个问题,但我还是更愿意坚持下去。


此错误意味着您没有 link 正确的库,或者 link 以错误的顺序编辑它们。
您需要按照以下确切顺序执行以下操作:-lmingw32 -lSDL2main -lSDL2.

这样做可能会将错误更改为 undefined reference to `SDL_main'。这意味着您使用的 main 的签名与 SDL 预期的不同。它必须是 int main(int, char **)int main(int, char *[])。允许添加参数名称,但您不能更改任何其他内容:您必须有参数,即使您不使用它们也是如此。