c++ - 对 WinMain@16 C++、SDL-2 的 undefined reference

标签 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 header 。这没有引起任何注意。
  • 我喜欢的图书馆的各种所谓的“正确命令”。到目前为止,这些似乎都没有帮助。

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

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

最佳答案

我觉得你想要

#define SDL_MAIN_HANDLED

在你的主文件中,行之前

#include <SDL2/SDL.h>

解释:

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

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

有时您希望 SDL 为您做这些事情,但如果您正在开发传统的控制台程序,通常您不会这样做。因此,您将此 SDL_MAIN_HANDLED 定义传递给 SDL,以防止执行所有这些操作。

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

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

关于c++ - 对 WinMain@16 C++、SDL-2 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342285/

相关文章:

c++ - 理解 C++ new 运算符

c++ - 优雅地从指针初始化 std::array 到缓冲区?

c++ - 如何将 C++11 随机数生成器传递给函数?

c++ - 在 C++ 中使用蒙特卡洛方法求 π 的问题

c++ - 错误 : opencv2/core/core. hpp:没有那个文件或目录

c++ - 在 std::string 或 char 数组中间使用 NULL char 进行更新

c++ - 为什么在 Windows/unix/linux 中使用管道被认为是危险的?

c++ - 修改二叉树的元素c++

C++11 如何使用 lambda 和高阶函数将 vector 转换为不同类型的 vector

c++ - 我的 C++ 代码可以编译,但变成了无法运行的无法杀死的程序