2、开发环境搭建:使用模拟器(PC模拟)快速上手、配置VS Code + SDL模拟器、编译第一个LVGL Demo

好,咱们正式开始动手了。

这一章,我带你把开发环境搭起来。说白了,就是让你能在自己的电脑上跑LVGL,看到图形界面动起来。不用买开发板,不用接屏幕,纯靠模拟器搞定。

我个人习惯用VS Code + SDL模拟器。为什么选这个组合?因为轻量、跨平台、调试方便。你想想看,写一行代码,按一下F5,界面就出来了,多爽。

2.1 为什么先用模拟器?

很多新手一上来就买开发板,结果卡在烧录、接线、驱动上,折腾半天连个点都点不亮。我刚开始学嵌入式GUI时也犯过这错。

模拟器的好处很明显:

  • 零硬件成本——你手头这台电脑就够了
  • 调试方便——打断点、看变量、改代码,秒级反馈
  • 快速验证——UI布局对不对、动画流不流畅,一眼就能看出来

等你在模拟器上把逻辑调通了,再移植到真机上,基本就是改改驱动的事。

2.2 安装必备工具

我们需要三样东西:VS Code、CMake、以及一个支持SDL的编译器。

工具 用途 下载地址(建议)
VS Code 代码编辑器 code.visualstudio.com
CMake 构建系统 cmake.org/download
MinGW(Windows) C编译器 mingw-w64.org
SDL2 图形后端 libsdl.org/download-2.0
我的建议:Windows用户直接装MSYS2,里面自带MinGW和SDL2。Linux用户用apt或yum装libsdl2-dev就行。macOS用户用brew install sdl2。

2.3 配置VS Code + SDL模拟器

嗯,这里步骤稍微多一点,但别怕。我一步步带你走。

2.3.1 克隆LVGL模拟器项目

LVGL官方提供了一个PC模拟器项目,叫lv_port_pc_eclipse。虽然名字带Eclipse,但用VS Code完全没问题。

git clone https://github.com/lvgl/lv_port_pc_eclipse.git
cd lv_port_pc_eclipse

2.3.2 安装VS Code插件

打开VS Code,装这几个插件:

  • C/C++(微软官方)
  • CMake Tools
  • Code Runner(可选,方便快速跑)

2.3.3 配置CMake

在项目根目录下,创建一个build文件夹:

mkdir build
cd build
cmake .. -G "MinGW Makefiles"

如果你用的是Linux或macOS,把MinGW Makefiles换成Unix Makefiles。

我曾经踩过的坑:Windows下如果SDL2路径不对,cmake会报找不到SDL2。解决办法是把SDL2的include和lib路径手动加到CMakeLists.txt里。具体加这两行:
include_directories("C:/SDL2/include")
link_directories("C:/SDL2/lib")

2.3.4 编译并运行

在VS Code里按Ctrl+Shift+P,输入CMake: Build,等编译完成。然后按F5运行。

如果一切顺利,你会看到一个灰色的窗口,中间有个LVGL的logo在旋转。恭喜,你的第一个LVGL Demo跑起来了!

2.4 第一个Demo代码解析

咱们看看模拟器里默认的main.c,其实核心代码就这几行:

#include "lvgl.h"
#include "lv_drivers/display/monitor.h"
#include "lv_drivers/indev/mouse.h"

int main(void)
{
    lv_init();
    monitor_init();
    mouse_init();

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = monitor_flush;
    lv_disp_drv_register(&disp_drv);

    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = mouse_read;
    lv_indev_drv_register(&indev_drv);

    // 创建一个简单的标签
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello LVGL!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    while(1) {
        lv_task_handler();
        SDL_Delay(5);
    }
    return 0;
}

你看,流程其实很清晰:初始化LVGL → 注册显示驱动 → 注册输入驱动 → 创建UI控件 → 进入事件循环。

关键点:lv_task_handler()必须放在主循环里,它负责处理LVGL的所有任务,比如动画刷新、输入响应。我曾经见过有人忘了加这个,结果界面卡死不动,排查了半天。

2.5 验证你的环境

跑起来之后,你可以试着改改代码。比如把"Hello LVGL!"改成你自己的名字,或者换个颜色。

我建议你做个简单测试:

  1. 改标签文字——确认代码修改生效
  2. 改窗口大小——在monitor_init()里调分辨率
  3. 加个按钮——试试lv_btn_create()

这些改动都能立刻看到效果。嗯,这就是模拟器最大的价值——即时反馈。

2.6 常见问题与避坑

  • 编译报错找不到lvgl.h——检查CMakeLists.txt里的LVGL路径是否正确。我习惯用git submodule来管理LVGL源码。
  • 窗口黑屏——多半是SDL2初始化失败。试试在main开头加个SDL_Init(SDL_INIT_VIDEO)。
  • 鼠标点击没反应——检查mouse_init()是否调用了,以及indev_drv.read_cb是否赋值正确。
一个小技巧:如果你觉得每次编译太慢,可以只改LVGL的配置头文件lv_conf.h,把不用的模块关掉。比如不需要图表就关掉LV_USE_CHART,编译速度能快一倍。

好了,环境搭好了,Demo也跑起来了。下一章咱们开始真正写自定义控件。你想想看,从零到一看到自己的代码变成图形界面,是不是挺有成就感的?