You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:15:07