解码LVGL Linux 系统(Ubuntu/WSL + 开发板)移植
LVGL 简介与核心特性
LVGL(Light and Versatile Graphics Library)是一款开源图形用户界面库,核心目标是为嵌入式系统提供轻量级、高可移植、灵活且易用的 GUI 解决方案。

LVGL 核心代码采用 C 语言编写,适配场景广泛,可在不同操作系统(如 Linux、RTOS)、微控制器(MCU)和图形加速器上运行;同时支持多种显示设备(液晶显示屏、OLED 显示屏等)与输入设备(触摸屏、物理按键、编码器等),能帮助开发人员快速构建交互式用户界面,且具备高度自定义能力 —— 用户可根据需求修改或扩展库功能,高效实现嵌入式系统中的各类交互式应用,其核心特性具体体现在以下方面:
丰富的内置部件
LVGL 包含 30+ 内置小部件,全面覆盖常见 UI 开发需求:

- 基础组件:Arc(圆弧)、Bar(进度条)、Checkbox(复选框)、开关、按钮,满足简单交互场景;
- 复杂组件:Calendar(日历)、Chart(图表)、下拉列表、键盘、仪表、消息框、表格、Tabview(标签页)、文本区域,支持复杂功能开发;
- 动态管理:部件支持实时创建与删除,可仅加载当前可见的屏幕和部件,大幅降低内存占用,适配嵌入式系统资源受限场景。
强大的渲染功能
LVGL 内置轻量级软件渲染引擎,以矢量图形方式绘制抗锯齿部件,兼顾渲染效果与资源消耗:

- 形状渲染:支持带半径的矩形、带半径的边框、弧线、斜线,实现细腻的图形边缘;
- 视觉增强:提供水平 / 垂直梯度填充、盒子阴影效果,提升 UI 视觉层次感;
- 图像处理:支持缩放、旋转图像或任意部件,且无需依赖额外图形库,适配不同显示需求。
高度灵活的样式系统

提供 100+ 样式属性,支持运行时动态调整,满足多样化 UI 设计需求:
- 状态化样式:可针对部件的不同状态(按下、选中、聚焦、禁用等)单独设置样式,实现交互反馈;
- 精细化自定义:支持部件局部样式调整(如滑块的主体、指示器、旋钮可分别配置),细节控制更精准;
- 自动样式动画:状态切换时,LVGL 可通过样式转换自动生成过渡动画,无需编写额外动画代码,提升交互流畅度。
智能布局能力
无需手动定位部件,通过内置布局快速实现响应式 UI,降低布局适配成本:

- Flex 布局:按预设策略(如居中、分散对齐)排列大量部件,支持灵活的间距与分布控制;
- 网格布局:将部件添加到用户定义的网格单元格中,支持精准对齐与跨列 / 跨行设置;
- 自适应调整:支持部件与父容器任意侧对齐、百分比尺寸单位,布局会随内容变化或容器尺寸调整自动更新,适配不同分辨率屏幕。
全面的字体与多语言支持
适配不同硬件性能的字体渲染方案,兼容多语种场景,满足全球化应用需求:

- 字体技术:支持 FreeType(适用于资源较丰富的 MPU 平台)、TinyTTF(适用于资源受限的 MCU 平台),可使用 1/2/4/8 位 / 像素字体、压缩字体,还能直接从 TTF 或 WOFF 文件渲染字形;
- 多语言兼容:字符串采用 UTF-8 解码,支持阿拉伯语、波斯语、希伯来语、泰语、中文、日语、韩语等,且可混合从右到左(如阿拉伯语)与从左到右(如中文)的书写方向;
- 补充功能:支持回退字体(当目标字体缺失某字形时,自动调用备用字体)与表情符号显示,提升文本表达丰富度。
灵活的转换功能
支持部件及嵌套子部件的复杂转换,兼顾视觉效果与交互体验:

- 基础转换:可对任意 LVGL 绘制的部件进行旋转、缩放操作,无需额外图像处理工具;
- 嵌套转换:子部件会继承父部件的转换属性(如父部件旋转后,子部件同步旋转),支持多层嵌套,实现复杂视觉效果;
- 手势适配:转换后的部件仍支持正常触摸手势,例如旋转后的列表可沿旋转方向滚动,保证交互逻辑不中断。
流畅的滚动体验
无需额外配置即可实现类似智能手机的流畅滚动效果,提升用户体验:

- 自动滚动:当部件子项超出父部件边界时,父部件自动变为可滚动状态,无需创建特殊 “滚动容器”;
- 增强功能:支持对齐滚动(滚动后子项自动对齐边界)、弹性滚动(超出边界后有回弹效果)、滚动动量(松手后保持惯性滚动)、滚动链接(多部件联动滚动,如列表与标题栏同步联动)。
此外,LVGL 遵循 MIT 开源协议,完全开源可控 —— 下载后可自主修改、发布,用于商业产品也无需支付任何授权费用,大幅降低开发成本。
Ubuntu/WSL移植
下载 LVGL 相关源码
确定下载文件与来源
需下载 2 个核心压缩包,优先选择推荐来源以保证速度:
- 第一个压缩包:lv_port_linux-release-v9.2.zip(Linux 平台预配置项目框架)
- 第二个压缩包:lvgl-6757a718a88af58591c90f5ab33ca2770606c314.zip(LVGL 核心代码)
- LVGL 核心库 GitHub 链接:LVGL · GitHub
解压与重命名压缩包
下载完成后,通过终端执行解压命令,同时简化目录名(避免长路径导致后续操作出错):
# 解压两个压缩包(默认解压到当前用户目录)
unzip lv_port_linux-release-v9.2.zip
unzip lvgl-6757a718a88af58591c90f5ab33ca2770606c314.zip# 重命名目录(缩短名称,便于后续命令输入)
mv lv_port_linux-release-v9.2/ lv_port_linux-9.2/
mv lvgl-6757a718a88af58591c90f5ab33ca2770606c314/ lvgl-6757a/# 验证目录是否创建成功(执行后应显示两个目标目录)
ls
lv_port_linux-9.2/ lvgl-6757a/
整合核心代码到项目框架
lv_port_linux-9.2/是 Linux 平台专用框架(含预配置 config 文件),lvgl-6757a/是 LVGL 核心代码,需将核心代码文件移入框架的lvgl/子目录,必须携带星号*(确保仅移动目录内文件,而非目录本身):
# 移动核心代码文件到框架的lvgl目录(星号*不可遗漏)
mv lvgl-6757a/* lv_port_linux-9.2/lvgl/# 注意:禁止直接执行`mv lvgl-6757a/ lv_port_linux-9.2/lvgl/`,否则会生成`lvgl/lvgl-6757a/`,导致编译找不到头文件
安装依赖库(Ubuntu 环境)
LVGL 运行需依赖显示、输入处理及工程管理工具,通过apt命令逐一安装:
安装 SDL2(显示与输入驱动)
SDL2 是与 Linux 帧缓冲机制(fbdev)、DRM 平行的显示框架,可提供图形显示、鼠标 / 键盘输入处理功能,安装命令如下:
sudo apt install libsdl2-dev
安装 xkb(标准输入库)
xkb 用于支持键盘布局等标准输入功能,安装前需先更新apt包索引,确保安装最新版本:
# 第一步:更新apt包索引
sudo apt update# 第二步:安装xkb及依赖的xcb库
sudo apt install libxkbcommon-x11-dev libxcb-icccm4-dev
sudo apt install libxcb-render-util0-dev libxcb-keysyms1-dev libxcb-image0-dev
安装 CMake(工程管理工具)
整个 LVGL 工程由 CMake 管理编译流程,需先在 Ubuntu 中安装 CMake,且安装后需重启 VSCode(否则 VSCode 无法识别 CMake):
# 第一步:更新apt包索引
sudo apt update# 第二步:安装CMake
sudo apt install cmake# 注意:CMake安装完成后,必须重启VSCode,才能在VSCode中正常配置CMake
VSCode 中配置 CMake
安装必要插件
打开 VSCode,进入「扩展商店」,搜索并安装以下两个插件(确保 CMake 功能正常使用):
- 插件 1:CMake(微软官方,提供 CMake 语法支持)
- 插件 2:CMake Tools(微软官方,提供构建、调试集成)

配置 CMake Tools 参数
设置状态栏可见性
-
操作路径:VSCode「设置」(快捷键
Ctrl+,)→ 搜索「CMake: Status Bar Visibility」→ 选择「visible」
-
作用:在 VSCode 状态栏显示 CMake 状态(如编译器、构建目标),方便实时查看与操作。
配置 CMake 生成器(关键,需严格匹配系统)
-
操作路径:VSCode「设置」→ 搜索「CMake: Generator」→ 输入「Unix Makefiles」

-
补充说明:
- Windows 系统编译 LVGL 时,生成器需设为「MinGW Makefiles」
- Ubuntu 系统编译 LVGL 时,生成器必须设为「Unix Makefiles」(大小写、空格不可错)
配置 LVGL 源码
配置显示机制(Ubuntu 用 SDL 模拟)
LVGL 支持 SDL、FBDEV、DRM 三种显示机制,Ubuntu 平台选择 SDL 模拟显示器,需修改lv_port_linux-9.2/lvgl/lv_conf.h配置文件:

配置窗口尺寸(修改 main.c)
窗口默认分辨率为 800×480,可在lv_port_linux-9.2/main.c中调整,代码需修正语法格式(补充缺失的问号运算符):

编译与运行验证
选择编译器
打开 VSCode,点击状态栏的「未选择工具包」→ 在弹出的工具包列表中,选择「GCC 13.3.0 x86_64-linux-gnu」(x86 平台编译器,若为其他架构需匹配对应编译器)。

执行编译
-
方式 1:点击 VSCode 状态栏的「生成」按钮(或快捷键
Ctrl+Shift+B)→ 选择「CMake: 生成」
-
方式 2:通过终端编译(进入项目根目录):
cd lv_port_linux-9.2/ mkdir build && cd build/ cmake .. make
编译完成后,若显示「[100%] Built target main」,表示编译成功。
运行与验证
# 进入可执行文件所在目录(默认在bin目录)
cd lv_port_linux-9.2/bin/# 运行LVGL程序
./main
运行后可能出现以下警告信息(属于正常现象,不影响功能,文档中已提及):
[Warn] lv_init: Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower lv_init.c:259[Warn] lv_init: Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower lv_init.c:263[Warn] lv_init: Style sanity checks are enabled that uses more RAM lv_init.c:267
若弹出 LVGL 模拟器窗口,显示控件演示界面,说明移植成功。

开发板移植补充(以 GEC6818 为例)
交叉工具链配置
开发板(ARM 架构)无法编译程序,需在电脑(X86 架构)上用交叉编译器编译出 ARM 能运行的文件,核心工具为arm-linux-gnueabi-gcc(5.4.0 版本常用)。
核心概念
- 交叉编译:在 A 架构(如 X86)编译出能在 B 架构(如 ARM)运行的程序;
- 编译器区别:
gcc用于 X86 程序编译,arm-linux-gcc用于 ARM 程序编译。
安装步骤(Ubuntu 系统)
步骤 1:拷贝压缩包到 Linux
- 将交叉编译器压缩包(如arm-linux-gnueabi-5.4.0.tar.xz)放到 VMware 共享文件夹(如
/mnt/hgfs/share); - 拷贝到 Linux 家目录(避免共享文件夹权限问题):
cp /mnt/hgfs/share/arm-linux-gnueabi-5.4.0.tar.xz ~/(~ 表示家目录,如 /home/gec)。
步骤 2:解压压缩包
- 先解压 xz 格式:
xz --decompress arm-linux-gnueabi-5.4.0.tar.xz(生成.tar 文件); - 再解压 tar 格式:
tar xf arm-linux-gnueabi-5.4.0.tar(生成usr文件夹,包含编译器文件)。
步骤 3:配置环境变量
环境变量用于让 Linux 在任何目录都能调用arm-linux-gcc。
- 进入编译器二进制文件目录:
cd ~/usr/local/arm/5.4.0/usr/bin(路径需与解压后的实际路径一致); - 查看当前路径:
pwd,复制输出(如/home/gec/usr/local/arm/5.4.0/usr/bin); - 编辑环境变量配置文件:
vi ~/.bashrc; - 在文件末尾添加:
export PATH=/home/gec/usr/local/arm/5.4.0/usr/bin:$PATH($PATH 表示保留原有环境变量); - 让配置生效:
source ~/.bashrc。
步骤 4:验证安装
输入 arm-linux-gcc -v,若显示版本信息(如gcc version 5.4.0),说明安装成功。
常见错误解决
- 错误:error while loading shared libraries: libmpfr.so.4原因:系统缺少
libmpfr.so.4库文件(Ubuntu 默认是libmpfr.so.6)。解决:创建软链接映射:sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4。 - 错误:./demo_arm: cannot execute binary file原因:在 X86 系统运行 ARM 程序(
demo_arm是 ARM 可执行文件)。解决:将demo_arm传到开发板,在开发板上运行。
显示机制适配
GEC6818 用 LCD 硬件(帧缓冲 FBDEV),需替换 Ubuntu 的 SDL 模拟显示,步骤逻辑与 Ubuntu 配置 SDL 一致,但参数不同:
修改 lv_conf.h(参考 Ubuntu “配置显示机制” 步骤)
打开lv_port_linux-9.2/lvgl/lv_conf.h,修改显示宏(禁用 SDL,启用 FBDEV):

调整 LCD 分辨率(参考 Ubuntu “配置窗口尺寸” 步骤)
GEC6818 默认 LCD 分辨率为 800x480,若需修改,打开lv_port_linux-9.2/lvgl/src/drivers/display/lv_linux_fbdev.c:
lv_display_t * lv_linux_fbdev_create(void)
{// ... 原有代码(定时器、内存分配)...// 修改分辨率为GEC6818 LCD实际参数(默认800x480)lv_display_t * disp = lv_display_create(800, 480);// ... 原有代码(关联回调、返回句柄)...
}
触摸屏适配(EVDEV,开发板特有,无 Ubuntu 参考步骤)
GEC6818 用电阻 / 电容触摸屏(EVDEV 驱动),需新增输入配置:
检测触摸屏设备文件(开发板终端操作)
在 GEC6818 开发板终端执行,确认触摸屏对应的设备文件路径:
# 查看输入设备列表及信息
[root@GEC6818 ~]# cat /proc/bus/input/devices
# 关键信息:找到"Name="gslX680""(GEC6818常用触摸屏芯片),记录"Handlers=event0"
# 设备文件路径:/dev/input/event0(后续代码需用此路径)
启用 EVDEV 驱动(修改 lv_conf.h)

添加触摸屏初始化代码(修改 main.c)
在lv_port_linux-9.2/main.c中添加初始化函数,并在 main 中调用:
// 引入EVDEV头文件
#include "lv_drivers/indev/evdev.h"// 触摸屏初始化函数
void lv_gec6818_touch_init(void)
{// 创建EVDEV输入设备(参数1:指针类型,参数2:触摸屏设备文件路径)lv_indev_t *touch_indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event0");// 将触摸屏关联到默认显示器(确保触摸位置与显示对应)lv_indev_set_disp(touch_indev, lv_disp_get_default());
}// 在main函数中调用(新增,放在显示器初始化后)
int main(void)
{lv_init(); // LVGL核心初始化(与Ubuntu一致)lv_linux_disp_init(); // 显示器初始化(FBDEV,替换Ubuntu的SDL初始化)lv_gec6818_touch_init(); // 新增:触摸屏初始化lv_demo_widgets(); // 运行demo(与Ubuntu一致)// 主循环(与Ubuntu一致)while(1) {lv_timer_handler();usleep(5000);}return 0;
}
CMake 调整(适配交叉编译,结构参考 Ubuntu 的 CMake 配置)
需修改lv_port_linux-9.2/CMakeLists.txt,适配 ARM 交叉编译,步骤结构参考 Ubuntu 的 CMake 配置:
选择交叉编译器(参考 Ubuntu “选择编译器” 步骤)
- 打开 VSCode,点击状态栏 “工具包”→ 选择
GCC 5.4.0 arm-none-linux-gnueabi(交叉编译器,替换 Ubuntu 的 x86 编译器)
修改 CMakeLists.txt(参考 Ubuntu“配置 CMakeLists.txt” 步骤)
- -rpath=”动态库的路径按需修改”
- 注释掉libdrm相关编译选项
- 注释掉SDL相关编译选项

编译与传输(编译步骤参考 Ubuntu,传输为开发板特有)
编译(参考 Ubuntu “编译步骤”)
与 Ubuntu 编译逻辑完全一致,通过 VSCode 或终端执行:
编译成功后,bin/目录生成 ARM 架构的main(Ubuntu 为 x86 架构)。
传输到开发板(开发板特有,无 Ubuntu 参考)
通过scp命令将main传送到 GEC6818 的/root目录(需确保 Ubuntu 与开发板在同一局域网):
# 格式:scp 本地文件路径 开发板用户名@开发板IP:开发板目标路径
gec@ubuntu:~/lv_port_linux-9.2/bin$ scp main root@192.168.1.100:/root/
# 输入开发板密码(默认多为root或123456),传输完成后提示“100%”
开发板运行验证
在 GEC6818 终端执行以下命令,启动 LVGL:
# 进入/root目录(可执行文件存放路径)
[root@GEC6818 ~]# cd /root/
# 赋予执行权限(首次运行需执行)
[root@GEC6818 ~]# chmod +x main
# 启动LVGL
[root@GEC6818 ~]# ./main
- 成功现象:LCD 显示 LVGL 控件 demo(按钮、滑块等),触摸屏幕可正常交互。

开发板特有常见问题(无 Ubuntu 参考)
LCD 黑屏(无显示)
-
原因 1:LCD 背光未开启,执行以下命令开启:
[root@GEC6818 ~]# echo 255 > /sys/class/backlight/lcd-backlight/brightness -
原因 2:FBDEV 设备路径错误,修改
lv_linux_fbdev.c中设备路径为/dev/fb0(GEC6818 默认帧缓冲设备)。
触摸屏无响应
- 原因:设备文件路径错误,重新执行
cat /proc/bus/input/devices确认触摸屏对应event号(如event1),并修改main.c中/dev/input/event0为实际路径。
