ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LVGL 9.2.2模拟器VS2022搭建:从环境配置到交互调试

LVGL 9.2.2模拟器VS2022搭建:从环境配置到交互调试 简介面向嵌入式图形界面开发者与 LVGL 学习者的 9.2.2 模拟器完整工程解决在 Windows 环境下使用 Visual Studio 2022 快速搭建模拟运行环境、验证界面逻辑与控件交互的实际需求。工程集成了模拟器核心源码、VS2022 项目配置以及大量示例界面资源如音乐播放器演示中的封面与频谱素材配套的 Python 辅助脚本和 TXT/Markdown 文档可帮助使用者理解构建流程、快速排查路径与依赖配置问题。资源共 2000 个文件以 C 源码和 H 头文件为主涵盖 LVGL 核心组件与基础控件实现同时包含 CPP 工程文件、JSON 配置文件及少量脚本与文档压缩包约 153.63MB目录结构按模块划分便于检索。目前已有 517 人浏览/学习面向需要直接在 PC 端评估 LVGL 9.2.2 特性、进行界面原型验证或二次开发的工程师能省去从零搭建环境的精力获得可直接编译运行的模拟器方案与排错参考。 搞嵌入式GUI开发的应该没人不知道LVGL。但很多人拿到LVGL源码后的第一反应是移植到板子上结果开发板还没到手、编译链没配好一天就折腾完了。其实在PC上跑模拟器是最快的验证方式不用碰硬件就能把界面逻辑全部调通等UI成型后再往目标板迁效率完全不一样。这篇我以LVGL 9.2.2为例带你把官方模拟器完整地跑在VS2022上整个过程覆盖环境搭建、源码配置、CMake构建和常见坑跟着操作一遍就能跑起来。1. 为什么要用VS2022跑LVGL 9.2.2模拟器1.1 模拟器能解决什么问题很多初学者把LVGL模拟器理解成“一个可以预览界面的小工具”实际它的价值远不止预览。LVGL模拟器是在PC上完整运行LVGL引擎包括显示驱动、输入设备、定时器、动画、布局、事件系统全部按真实环境执行。你写的每一行界面代码在模拟器上跑的效果和板子上几乎一致区别只是渲染后端不同。这意味着你做菜单、弹窗、列表、图表、动画这些交互逻辑完全可以在电脑上迭代调试不用一遍遍烧录固件。我有段时间做STM32项目一天编译下载几十次后来改成先在模拟器上把UI和交互全部调好再移植过去只需要处理驱动和资源适配开发周期至少缩短一半。1.2 为什么选9.2.2版本LVGL在8.x到9.x之间做了一次比较大的重构9.x版本的API和8.x有本质差异比如显示驱动和输入设备的注册方式变了很多8.x的示例代码不能直接拿到9.x编译。如果网上搜索到的教程多半还是8.x的写法你拿9.2.2去编译就会看到一堆报错。9.2.2是当前9.x系列里比较稳定的一个release版本修复了大量驱动和高DPI适配问题SDL2桌面驱动已经原生集成在源码里不需要像8.x那样额外拉一个lv_drivers仓库。对于新项目直接上车9.2.2是对的不用担心学了一个即将淘汰的旧版本。1.3 技术方案选择在Windows下跑LVGL模拟器常见方案有这么几种官方VS工程模板.sln直接打开纯CMake命令行构建CMake vcpkg管理依赖MinGW SDL2我自己实测下来最省心的是CMake配合vcpkg安装SDL2再让CMake生成VS2022的.sln工程。这样既能享受VS的智能提示和调试器又不依赖某个仓库里可能过时的VS工程文件整个构建过程完全可控。2. 环境准备VS2022与基础工具安装2.1 VS2022社区版安装要点VS2022社区版对个人开发者完全免费直接去Visual Studio官网下载安装器就行。需要注意的只有一个点安装时“工作负载”必须勾选“使用C的桌面开发”这一项包含MSVC编译器、Windows SDK和C CMake工具。很多人在这一步踩坑装完VS后创建不了C项目或者CMake找不到编译器基本都是因为只装了默认的.NET负载。建议顺手把右侧“单个组件”里的“C CMake tools for Windows”也勾上后面构建省事很多。安装完后打开VS2022在“工具-获取工具和功能”里可以确认组件是否齐全。可以用下面的简单代码验证编译器#include iostream int main() { std::cout LVGL Simulator Ready std::endl; return 0; }新建一个控制台应用跑一下能输出就说明环境没问题。2.2 CMake和Git的准备VS2022自带的CMake版本一般够用但我还是建议装一个最新的CMake独立版本因为LVGL官方文档和一些第三方demo有时会用到较新的CMake命令。到cmake.org下载Windows x64安装包安装时勾选“Add CMake to system PATH”这样命令行里就能直接敲cmake。Git同样建议装。虽然可以直接在GitHub页面下载zip但用git clone能精确锁定tag版本后续想切分支或者更新也比较方便。装好Git后在任意目录右键看到“Git Bash Here”就说明成功了。检查工具是否就位cmake --version git --version cl能输出版本号就说明环境没问题。如果cl命令提示找不到打开“x64 Native Tools Command Prompt for VS 2022”再试。3. 获取LVGL 9.2.2源码并完成配置3.1 源码下载与目录结构LVGL源码托管在GitHub上仓库名就是lvgl。我们直接拉指定taggit clone --branch v9.2.2 --depth 1 https://github.com/lvgl/lvgl.git如果已经克隆过完整仓库也可以用git checkout v9.2.2拉下来的目录结构大致如下lvgl/ ├── src/ │ ├── core/ # 核心对象、事件、刷新 │ ├── draw/ # 渲染引擎 │ ├── drivers/ # 各类驱动含sdl、windows等 │ ├── fonts/ # 内置字体 │ ├── layouts/ # Flex和Grid布局 │ ├── libs/ # 额外库如png、jpeg、fs │ ├── misc/ # 内存、日志、系统接口 │ ├── themes/ # 默认主题 │ └── widgets/ # 常用控件 ├── demos/ ├── examples/ ├── lvgl.h ├── lv_conf_template.h └── CMakeLists.txt9.x把驱动全部收进了src/driversSDL驱动就在src/drivers/sdl目录下这对模拟器项目来说非常友好不需要额外引用外部驱动库。3.2 创建并修改lv_conf.hLVGL使用宏定义来控制编译配置配置文件叫lv_conf.h。源码目录里默认只有模板文件lv_conf_template.h第一次使用需要复制一份并命名为lv_conf.hcp lvgl/lv_conf_template.h lvgl/lv_conf.h推荐把lv_conf.h放在工程源码目录下比如项目根目录的config文件夹然后在CMake里通过include目录指过去。但最省事的方式是直接放在lvgl目录里这样LVGL源码会自动找到它。我习惯放lvgl目录下简单直接。打开lv_conf.h重点检查这几个宏#define LV_COLOR_DEPTH 32 // 模拟器建议32位色 #define LV_USE_SDL 1 // 启用SDL驱动 #define LV_USE_DEMO_WIDGETS 1 // 启用官方demo #define LV_FONT_SIMSUN_16_CJK 1 // 需要显示中文时打开 #define LV_USE_LOG 1 // 建议打开日志调试时有用LV_COLOR_DEPTH在PC模拟器上直接设32板子如果屏是16位的再改回去。SDL驱动宏不打开模拟器的窗口和鼠标键盘驱动都不会被编译进来这一步容易漏。9.2.2的配置项比8.x精简了不少比较复杂的模块比如各种第三方解码库默认就是关闭状态不用动。3.3 SDL2依赖的安装方式在Windows上LVGL的SDL驱动依赖SDL2库。强烈推荐用vcpkg安装比手动下载SDL2开发包配置环境变量简单太多。git clone https://github.com/microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg install sdl2:x64-windows安装完成后记住vcpkg目录的位置后面CMake配置时要通过toolchain文件指定。vcpkg会自动编译SDL2并生成CMake可识别的配置文件这是我认为最不容易出错的路径。如果你不想用vcpkg也可以去SDL官网下载SDL2-devel-2.30.x-VC.zip解压后手动在CMake里设置SDL2_DIR变量。但需要确认下载的包是否带CMake config文件有些版本只有.lib和.dll没有CMake配置find_package会失败。vcpkg方案能避开这些不确定性。4. 创建模拟器工程并编译运行4.1 CMake工程结构我习惯把所有文件放在一个干净的simulator目录下目录结构如下lvgl_simulator/ ├── CMakeLists.txt ├── main.c └── lvgl/ └── ...上面拉下来的源码CMakeLists.txt是工程的核心先看完整内容cmake_minimum_required(VERSION 3.16) project(lvgl_simulator C) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) add_subdirectory(lvgl) add_executable(lvgl_simulator main.c) target_include_directories(lvgl_simulator PRIVATE lvgl) target_link_libraries(lvgl_simulator PRIVATE lvgl::lvgl) find_package(SDL2 REQUIRED) target_link_libraries(lvgl_simulator PRIVATE SDL2::SDL2)这里有个细节要注意add_subdirectory(lvgl)会把LVGL源码编译成静态库目标目标名一般是lvgl::lvgl。如果CMake配置时报找不到这个目标去lvgl/CMakeLists.txt里搜一下实际的target名字把链接行改成对应名称即可。find_package(SDL2 REQUIRED)需要在add_subdirectory(lvgl)之前或之后都行但为了让LVGL编译SDL驱动时能识别SDL2头文件建议把find_package放到add_subdirectory之前。我自己测试时放前面更能保证LVGL里的SDL源码能拿到SDl2头文件搜索路径。4.2 main.c核心代码main.c是整个模拟器的入口代码如下#include lvgl.h #include lvgl/src/drivers/sdl/lv_sdl_window.h #include lvgl/src/drivers/sdl/lv_sdl_mouse.h #include lvgl/src/drivers/sdl/lv_sdl_keyboard.h int main(void) { lv_init(); /* 创建SDL窗口指定分辨率 */ lv_display_t * display lv_sdl_window_create(800, 480); /* 注册鼠标输入 */ lv_indev_t * mouse lv_sdl_mouse_create(); lv_indev_set_display(mouse, display); /* 注册键盘输入 */ lv_indev_t * keyboard lv_sdl_keyboard_create(); lv_indev_set_display(keyboard, display); /* 加载官方控件demo */ lv_demo_widgets(); while (1) { lv_timer_handler(); lv_delay_ms(5); } return 0; }这个代码的流程很清晰先lv_init初始化LVGL然后创建SDL窗口得到display对象再创建鼠标和键盘输入设备最后在死循环里不断调用lv_timer_handler处理界面刷新和事件响应。lv_demo_widgets默认会展示按钮、滑块、仪表盘、图表、日历等常用控件。如果你只想跑一个空白界面把这行注释掉即可。需要注意的是9.x的API和8.x差别很大。8.x里有lv_disp_drv_register和lv_indev_drv_register9.x换成了lv_display_create和lv_indev_createSDL驱动也直接返回lv_display_t指针。如果你在网上看到的是lv_disp_drv_t初始化那套老代码直接套用到9.2.2必然编译失败。4.3 使用vcpkg配置并编译CMake配置命令如下需要指定vcpkg的toolchain文件cmake -B build -G Visual Studio 17 2022 -A x64 -DCMAKE_TOOLCHAIN_FILED:/vcpkg/scripts/buildsystems/vcpkg.cmake执行完会在build目录下生成lvgl_simulator.sln。之后有两种方式编译运行方式一命令行直接构建cmake --build build --config Release方式二用VS打开build目录下的解决方案start build/lvgl_simulator.sln然后在VS里把启动项目设为lvgl_simulator配置改成Release x64按F5直接运行。我实际更推荐用VS运行因为可以打断点调试UI流程。如果生成解决方案时VS提示找不到SDK或MSVC版本不匹配把VS2022更新到最新版即可或者换用“Visual Studio 17 2022”老一点的generator名称。运行成功后你会看到一个800x480的窗口里面显示LVGL官方demo界面鼠标可以点击控件键盘能触发焦点事件。4.4 CMake生成解决方案的常见参数这里补充一下-G参数的用法。如果你电脑上同时装有VS2019和VS2022需要明确指定generator名称。VS2022对应“Visual Studio 17 2022”VS2019对应“Visual Studio 16 2019”。另外如果源码和生成目录在不同磁盘有些复杂项目的相对路径会出问题。建议build目录就放在工程目录下形成lvgl_simulator/build的结构我这个工程就是这么安排的。5. 常见问题与排查实录5.1 SDL2库找不到这是最常遇到的问题。CMake报错信息大概长这样Could not find a package configuration file provided by SDL2 with any of the following names: SDL2Config.cmake sdl2-config.cmake原因基本是vcpkg的toolchain路径没写对或者SDL2还没安装。重点检查确认vcpkg路径正确windows路径分隔符正斜杠反斜杠都行确认sdl2已经装到x64-windows可以用vcpkg list查看确认CMakeLists里的find_package(SDL2 REQUIRED)和toolchain文件在同一套环境中还有个容易忽略的点如果改了vcpkg路径一定要删除build目录重新配置CMake会缓存旧的SDL2路径不清理缓存改多少遍都报同样的错。5.2 编译报错API不匹配这个问题的根源大多是代码用了8.x的API。常见报错有lv_disp_drv_register未声明lv_disp_buf_t类型不存在lv_indev_drv_t结构体成员不存在9.x不再使用lv_disp_drv_t手动初始化显示驱动改成直接调用lv_sdl_window_create获取display对象。输入设备也一样不再需要手动填充lv_indev_drv_t结构体。所以写代码前先确认你参考的教程或demo对应的LVGL版本8.x的示例不能直接用于9.2.2。5.3 窗口黑屏窗口能弹出来但全黑排查顺序是否调用了lv_timer_handler没有这个循环界面永远不会刷新是否重复调用了lv_init或者声明了两个displayDLL是否齐全SDL2.dll要放在生成的exe同目录下vcpkg安装的sdl2是静态链接的一般不会缺DLL。如果你是手动下载SDL2开发包则需要把SDL2.dll复制到exe目录否则窗口会提示找不到入口点或者直接黑屏。5.4 中文显示乱码LVGL默认字体不包含中文字符。显示中文只有两条路在lv_conf.h中启用CJK字体比如LV_FONT_SIMSUN_16_CJK使用字体转换工具将ttf转成LVGL格式然后加载自定义字体CJK字体文件较大正式产品里通常用后一种方式控制资源体积。模拟器调试阶段直接用内置CJK字体最省事记得到lv_conf.h里把对应宏打开。还要注意源码文件本身编码必须是UTF-8如果是GBK编码VS编译时会警告显示出来就是乱码。5.5 Debug模式性能差LVGL模拟器在Debug模式下跑官方demo会明显卡顿因为LVGL大量使用了内联和内存操作Debug版本的优化程度很低。解决办法很简单构建Release版本。我自己调试逻辑的时候用Debug验证性能的时候切Release两边切换成本很低。如果Release下还是卡检查LV_DISP_ROT、LV_DPI_DEF等宏是否设得离谱分辨率越大渲染开销越高。5.6 常见问题速查表症状可能原因解决方案CMake找不到SDL2vcpkg路径错误检查toolchain路径删除build缓存重跑编译报API错误使用了8.x旧API改用9.x的lv_display_create系列API窗口黑屏未调用lv_timer_handler死循环中加上定时刷新调用中文乱码未启用CJK字体lv_conf.h打开LV_FONT_SIMSUN_16_CJK鼠标点击无反应未注册输入设备创建lv_sdl_mouse并挂到display界面卡顿Debug模式切换Release构建编译报C4996MSVC安全函数警告添加_CRT_SECURE_NO_WARNINGS宏6. 环境隔离与后续扩展6.1 多版本LVGL共存管理很多人的电脑上不止一套LVGL8.3的工程和9.2.2的工程可能同时存在。建议每个工程目录里独立放置lvgl源码不要共用一份源码。LVGL的太多项目会互相污染特别是lv_conf.h这类配置文件的改动一旦共用很容易影响其他工程。我用Git管理项目时把lvgl作为submodule引入这样每个工程锁定自己的版本需要升级时单独切换到目标tag控制起来很清楚。6.2 从模拟器迁移到真实板卡模拟器调通之后迁移到真实硬件要注意以下差异显示驱动从SDL驱动换成项目使用的TFTLCD或者RGB屏驱动输入设备从鼠标换成触摸屏或编码器内存配置PC上内存充裕板子上要规划好LV_MEM_SIZE字体资源模拟器用PC字体文件板子上要处理字库存储界面的核心逻辑包括布局、事件、动画迁移时基本不需要改这就是模拟器最大的价值。我自己做产品原型时通常先在模拟器里画好界面和交互逻辑然后进入硬件联调阶段这样能把“写UI”和“调驱动”两个任务解耦每一步都足够聚焦。最后再分享一个个人实操经验如果你发现SDL窗口创建的界面显示比例不对先把LV_DPI_DEF设成模拟器的DPI值比如Windows缩放125%时设成120窗口里的控件大小就会更接近真实设备效果。这个值直接影响控件默认尺寸不在硬件上对比很难发现差异很多人到移植后才意识到最后又得回头调布局。本文还有配套的精品资源点击获取
返回列表