我收到了错误undefined reference to WinMain@16
。为节省空间,here's a link to all the files currently in the project。目前,除了创建一个窗口,填充绿色,然后在角落里绘制一个框,同时通过控制台跟踪鼠标的位置时,它不应该做很多事情。但是,它不会构建,我给出了上述错误。
我的链接库是:
我正在使用Codeblocks 13.12和g ++遵循C ++ 11 ISO C ++语言标准。我的电脑正在使用Windows 10以防万一。
我花了很长时间试图找到一个解决方案,似乎每个人都有一个完全不同的解决方案,到目前为止,他们都没有为我工作过。一些例子包括:
-lSDL2_image
。main
功能更改为WinMain
。我收到了同样的错误消息。Windows.h
标头。这没有什么明显的。我还应该指出用户提供的答案,干杯和他。 - Alf,here可能就是我正在寻找的东西,但说实话,我不能完全理解我应该做的事情。
如果我忘记包含任何相关信息,请告诉我,我会尽快这样做。提前谢谢。
答案 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 *[])
。允许添加参数名称,但是您不能更改其他任何内容:即使不使用参数,也必须具有参数。