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

The*_*rca 5 c++ codeblocks winmain c++11 sdl-2

我一直在收到错误undefined reference to WinMain@16.为了节省空间,这里是指向项目中当前所有文件的链接.目前,除了创建一个窗口,填充绿色,然后在角落里绘制一个框,同时通过控制台跟踪鼠标的位置时,它不应该做很多事情.但是,它不会构建,我给出了上述错误.

我的链接库是:

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

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

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

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

我还应该指出用户提供的答案,干杯和他.- 阿尔夫,这里可能是我正在寻找的东西,但说实话,我无法完全理解我应该做的事情.

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

Hol*_*Cat 10

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


此错误意味着您没有链接正确的库,或者以错误的顺序链接它们。
您需要按照以下顺序进行操作:-lmingw32 -lSDL2main -lSDL2

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

  • 谢谢你,成功了。这应该被接受的答案。 (2认同)

Chr*_*eck 8

我想你想要的

#define SDL_MAIN_HANDLED
Run Code Online (Sandbox Code Playgroud)

在你的主文件中,在行之前

#include <SDL2/SDL.h>
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

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

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

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

  • 这消除了错误。谢谢。如果您不介意我问,为什么/如何解决这个问题? (2认同)