Windows10下Cygwin用gcc编译SDL2程序提示WinMain未定义如何解决
问题原因
- 库架构不匹配:你当前使用的是Cygwin原生的x86_64-pc-cygwin版本gcc,但是链接的SDL2库是x86_64-w64-mingw32架构的MinGW版本,两种运行时不兼容,链接阶段无法正确识别SDL2main库中提供的WinMain入口实现。
- 必要依赖被误删:你移除的
-lmingw32是MinGW环境编译SDL程序的必要依赖项,SDL2main库需要依赖mingw32库完成入口函数转发,将你代码中写的main函数转成Windows图形程序要求的WinMain入口。 - 参数适配错误:
-mwindows是MinGW gcc的专属参数,Cygwin原生gcc对该参数的支持不完整,也会导致入口识别异常。
解决方案
你可以根据自己的需求选择以下任意一种方案解决问题:
方案1:使用MinGW工具链编译原生Windows程序(兼容性更强,推荐)
- 先在Cygwin的包管理器中安装MinGW工具链:安装
mingw64-x86_64-gcc包,不要使用默认的Cygwin原生gcc - 修改Makefile中的编译器为MinGW版本gcc,把之前删掉的
-lmingw32加回链接参数,修改后的Makefile内容如下:
hellosdl: x86_64-w64-mingw32-gcc hellosdl.c -L../SDL2-2.0.18/x86_64-w64-mingw32/lib -lmingw32 -lSDL2main -lSDL2 -mwindows -I../SDL2-2.0.18/x86_64-w64-mingw32/include/SDL2
- 该方案编译出的exe是原生Windows程序,不需要Cygwin环境就能独立运行。
方案2:使用Cygwin原生gcc编译Cygwin平台SDL程序
- 先在Cygwin的包管理器中安装Cygwin版本的SDL2开发包:
libSDL2-devel - 直接用Cygwin自带的
sdl2-config工具生成编译参数,不需要手动写库和头文件路径,修改后的Makefile内容如下:
hellosdl: gcc hellosdl.c `sdl2-config --cflags --libs` -o hellosdl
- 该方案编译出的程序依赖Cygwin运行时,只能在安装了对应版本Cygwin的环境下运行。
内容的提问来源于stack exchange,提问作者dyarob
相关产品推荐
相关产品推荐

