如何在Linux上为Windows平台交叉编译C语言编写的SDL2程序
Ubuntu交叉编译SDL2程序到Windows平台操作步骤
1. 搭建交叉编译环境
- 安装64位Windows交叉编译工具链,在Ubuntu终端执行命令:
sudo apt update sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64
如果需要编译32位Windows程序,替换安装包为gcc-mingw-w64-i686即可。
- 准备Windows平台的SDL2相关开发依赖:
获取适配MinGW的SDL2、SDL2_ttf、SDL2_image开发包,解压后将三个包内的头文件统一拷贝到自定义的交叉编译依赖目录的include子文件夹,将所有静态/导入库文件(后缀为.a/.dll.a)统一放到该目录的lib子文件夹。同时留存三个开发包bin目录下的所有.dll文件,后续运行exe时需要和可执行文件放在同一目录。
示例依赖目录结构(以存放在~/win64-dep为例):~/win64-dep/ ├── include/ # 所有SDL相关头文件 └── lib/ # 所有链接用的库文件
2. 修改原有Makefile
原Makefile存在两处需要调整的问题:一是本地Linux用的sdl2-config无法识别Windows版本的SDL库,二是main.o编译规则里存在笔误--libds,交叉编译场景下直接废弃该工具,手动指定编译链接参数即可。
适配交叉编译的Makefile内容如下,注意根据你自己的依赖存放路径修改SDL_PATH变量的值:
# 交叉编译工具链前缀 CC = x86_64-w64-mingw32-gcc # 替换成你自己的SDL依赖目录 SDL_PATH = /home/你的用户名/win64-dep CFLAGS = -I$(SDL_PATH)/include LDFLAGS = -L$(SDL_PATH)/lib # 输出的Windows可执行文件 TARGET = game.exe OBJECTS = main.o text.o object.o vector.o physics.o shapes.o target.o all: $(OBJECTS) $(CC) $(OBJECTS) $(LDFLAGS) -lmingw32 -lSDL2main -lSDL2 -lSDL2_ttf -lSDL2_image -lm -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -o $(TARGET) main.o: main.c defs.h $(CC) -c main.c $(CFLAGS) text.o: text.c text.h defs.h $(CC) -c text.c $(CFLAGS) object.o: object.c object.h defs.h $(CC) -c object.c $(CFLAGS) vector.o: vector.c vector.h defs.h $(CC) -c vector.c $(CFLAGS) physics.o: physics.c physics.h defs.h $(CC) -c physics.c $(CFLAGS) shapes.o: shapes.c shapes.h defs.h $(CC) -c shapes.c $(CFLAGS) target.o: target.c target.h defs.h $(CC) -c target.c $(CFLAGS) clean: rm *.o $(TARGET)
注意:链接参数里
-lmingw32 -lSDL2main必须放在其他SDL库的前面,否则会出现找不到WinMain入口的链接错误。
3. 编译与运行
- 在项目目录执行
make命令,即可生成对应Windows平台的.exe可执行文件。 - 将之前留存的所有SDL相关dll文件,和生成的exe文件放在同一文件夹,拷贝到Windows系统即可直接运行,无需额外安装运行库。
- 如果编译时提示头文件找不到,检查
SDL_PATH路径配置、头文件存放位置是否正确;如果提示链接找不到库,检查库文件存放路径、链接参数顺序是否符合要求。
内容的提问来源于stack exchange,提问作者Sean Gaines
相关产品推荐
相关产品推荐

