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

时间:2015-09-01 23:13:07

标签: c++ c++11 codeblocks sdl-2 winmain

我收到了错误undefined reference to WinMain@16。为节省空间,here's a link to all the files currently in the project。目前,除了创建一个窗口,填充绿色,然后在角落里绘制一个框,同时通过控制台跟踪鼠标的位置时,它不应该做很多事情。但是,它不会构建,我给出了上述错误。

我的链接库是:

  • glew32s
  • libSDL2main
  • 的mingw32
  • libSDL2
  • opengl32
  • glew32

我正在使用Codeblocks 13.12和g ++遵循C ++ 11 ISO C ++语言标准。我的电脑正在使用Windows 10以防万一。

我花了很长时间试图找到一个解决方案,似乎每个人都有一个完全不同的解决方案,到目前为止,他们都没有为我工作过。一些例子包括:

  • 根据this similar question将SDL2_image添加到我的链接库。它给了我错误-lSDL2_image
  • 完全从头开始项目以防万一我没注意到的错误是原因。 (我得到完全相同的错误)。
  • main功能更改为WinMain。我收到了同样的错误消息。
  • 添加Windows.h标头。这没有什么明显的。
  • 我的liker图书馆的各种所谓“正确的命令”。到目前为止,这些似乎没有任何帮助。

我还应该指出用户提供的答案,干杯和他。 - Alf,here可能就是我正在寻找的东西,但说实话,我不能完全理解我应该做的事情。

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

2 个答案:

答案 0 :(得分:8)

我想你想要

#define SDL_MAIN_HANDLED

在你的主文件中,在行

之前
#include <SDL2/SDL.h>

说明:

在SDL / SDL2中,为了尝试简化某些类型的应用程序的跨平台开发,SDL创建了一个自定义的入口点&#34;到您的申请。也就是说,您的int main()不是真正的主要内容。会发生什么,main被定义为SDL标头中的一个宏,这会导致您的main重命名为SDL_main或类似。然后,在&#34; SDL_main&#34;库定义了一个不同的main,它将是您应用程序的真实main。此main只是以适合平台的任何方式获取命令行参数,并调用main(已重命名为SDL_main)。

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

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

#undef main方法也会起作用,但它并不是那么好,因为这样,你告诉SDL发生了什么,用另一种方法,SDL认为所有这些方法都是如此将要使用的东西,实际上你稍后会使用#undef粗略地禁用它。

如果要查看各种宏/平台检查的详细信息,可以查看SDL_main.h标题。如果您想了解SDL主系统的优点,可以查看SDL文档。

答案 1 :(得分:0)

已接受的答案(未定义main,定义SDL_MAIN_HANDLED等所有建议的解决方案均与SDL2的使用方式有所不同。预期的方法是否正确是另一个问题,但是我还是要坚持下去。


此错误表示您未链接正确的库,或未按错误的顺序链接它们。
您需要按照正确的顺序进行操作:-lmingw32 -lSDL2main -lSDL2

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