11

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

我的链接器库是:

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

我按照 C++11 ISO C++ 语言标准使用带有 g++ 的 Codeblocks 13.12。我的电脑正在使用 Windows 10,以防万一。

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

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

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

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

4

2 回答 2

20

我想你想要

#define SDL_MAIN_HANDLED

在您的主文件中,在该行之前

#include <SDL2/SDL.h>

解释:

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

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

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

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

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

于 2015-09-02T01:00:02.327 回答
2

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


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

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

于 2020-12-05T09:22:11.283 回答