如何在带LCD的无X嵌入式Linux中成功运行SDL2示例?
问题描述
- 运行环境:Linux 5.10.24内核,ARMv7四核嵌入式系统,配备LCD显示屏,无X Window环境,当前运行QT UI,存在
/dev/fb0和/dev/fb1两个帧缓冲设备 - 操作:从串口控制台运行SDL2示例程序,执行失败
- 示例代码:
#include "SDL2/SDL.h" int main(int argc, char* argv[]) { SDL_Window* window; SDL_Renderer* renderer; if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("error initializing SDL: %s\n", SDL_GetError()); return 1; } window = SDL_CreateWindow("SDL_RenderClear", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 512, 512, 0); renderer = SDL_CreateRenderer(window, -1, 0); SDL_SetRenderDrawColor(renderer, 64, 255, 128, 255); SDL_RenderClear(renderer); SDL_RenderPresent(renderer); SDL_Delay(5000); SDL_Quit(); return 0; }
- 编译命令:
mips-linux-gnu-gcc -g2 sdl_ex1.c -I/sysroot/usr/include/ -Lsysroot/usr/lib/ -lSDL2 -lts -o sdl_ex1
- 运行错误:
~ # ./sdl_ex1 error initializing SDL: No available video device ~ # echo $DISPLAY ~ #
- 验证情况:该示例在Ubuntu 20.04虚拟机Xterm中可正常运行
解决步骤
1. 修正编译工具链错误
你的系统是ARMv7架构,但编译时使用了MIPS架构的mips-linux-gnu-gcc,这会导致生成的二进制无法在ARM系统上正确执行。替换为对应ARMv7的交叉编译器,比如arm-linux-gnueabihf-gcc,同时修正-L参数的路径格式:
arm-linux-gnueabihf-gcc -g2 sdl_ex1.c -I/sysroot/usr/include/ -L/sysroot/usr/lib/ -lSDL2 -lts -o sdl_ex1
2. 指定SDL使用帧缓冲设备
无X Window环境下,SDL需要明确指定使用fbcon视频驱动,通过环境变量配置:
# 指定视频驱动为帧缓冲模式 export SDL_VIDEODRIVER=fbcon # 指定未被QT占用的帧缓冲设备(QT大概率占用了fb0,所以用fb1) export SDL_FBDEV=/dev/fb1
配置完成后运行程序:
./sdl_ex1
3. 检查SDL2编译配置
确保嵌入式系统中的SDL2库支持fbcon驱动,执行以下命令查看SDL特性:
sdl2-config --features
如果输出中没有fbcon,说明SDL2未编译该驱动支持,需重新编译SDL2:
./configure --host=arm-linux-gnueabihf --prefix=/sysroot/usr --enable-video-fbcon --disable-video-x11 make && make install
4. 处理QT与SDL的帧缓冲冲突
如果必须使用/dev/fb0,可以先停止QT服务释放帧缓冲:
# 根据系统实际QT服务名调整,示例为qt5-app /etc/init.d/qt5-app stop # 指定SDL使用fb0 export SDL_FBDEV=/dev/fb0 ./sdl_ex1
5. 补充触摸相关环境变量(可选)
因为编译时链接了-lts,可补充TSLIB相关变量确保触摸功能正常(根据实际设备节点调整):
export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_FBDEVICE=/dev/fb1
内容的提问来源于stack exchange,提问作者wangt13
相关产品推荐
相关产品推荐

