当前位置: 首页 > news >正文

从零开始在 Linux 上编译运行 lvgljs 图形界面项目

项目简介

lvgljs 是一个用 JavaScript/React 语法操作 LVGL(轻量级通用图形库)的开源项目。它将 LVGL 的 C 语言 UI 组件封装成了类似 React 的组件化接口,开发者可以用 JSX 编写嵌入式 UI,渲染到 SDL2 模拟器或真实的嵌入式设备上。

技术栈:

  • JavaScript 运行时:txiki.js(基于 QuickJS + libuv + curl)
  • 图形引擎:LVGL(嵌入式 GUI 库)
  • 前端框架:自定义 React Reconciler(virtual DOM → LVGL C 调用)
  • 构建工具:CMake(native 层) + esbuild(JS 层)

一、环境准备

1.1 安装系统依赖

sudoaptupdatesudoaptinstall-y\git\cmake\nodejs\npm\libsdl2-dev\libcurl4-openssl-dev\libffi-dev\libtool\autoconf\automake\texinfo

各依赖说明:

包名用途
git克隆代码、拉取 git 子模块
cmakeCMake >= 3.16,构建 native 层
nodejs/npm运行 esbuild、打包 JS bundle
libsdl2-devSDL2 模拟器显示驱动
libcurl4-openssl-devtxiki.js HTTP 客户端依赖
libffi-dev外部 FFI 库(解决 CMake 4.x 兼容问题)
libtool autoconf automake texinfolibffi 源码构建工具链

1.2 克隆代码并初始化子模块

gitclone https://github.com/lvgl/lv_binding_js.gitcdlv_binding_jsgitsubmodule update--recursive--init

这一步会拉取三个关键子模块:

  • deps/lvgl— LVGL 图形库
  • deps/lv_drivers— LVGL 输入/显示驱动
  • deps/txiki— JavaScript 运行时

二、修改构建配置(关键步骤)

项目的 Makefile 设计时针对标准 CMake 版本,在Ubuntu26.04系统上,CMake 4.x 环境下需要做两处修改。

打开项目根目录的Makefile,找到simulator目标,将 cmake 命令修改为:

simulator: @mkdir -p $(BUILD_SIM) cmake -B "$(BUILD_SIM)" -DCMAKE_BUILD_TYPE=Simulator -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DUSE_EXTERNAL_FFI=ON "-DCMAKE_C_FLAGS=-Wno-error=discarded-qualifiers -Wno-error=unterminated-string-initialization" cmake --build $(BUILD_SIM) -j

修改说明:

参数原因
-DUSE_EXTERNAL_FFI=ONCMake 4.x 与 libffi 的 autotools 构建系统不兼容,使用系统已安装的 libffi
-Wno-error=discarded-qualifierstxiki 依赖的 quickjs 代码中有const限定符警告被-Werror拦截
-Wno-error=unterminated-string-initialization同上,quickjs 中字符串初始化警告被当作错误

三、编译并运行

3.1 一键编译模拟器

makesimulator

这一步骤会:

  1. 创建build/目录
  2. 运行 CMake 配置(Simulator 模式会自动链接 SDL2)
  3. 编译 txiki.js、LVGL、lv_drivers 和项目自身的 C++ 绑定层

编译产物为build/lvgljs可执行文件。

3.2 打包 JS Bundle

npminstall# 安装前端依赖(首次运行一次即可)npmrun bundle# 用 esbuild 将 .jsx/.tsx 打包成 .js

build.js会扫描demo/*/index.jsxtest/*/index.jsx,将所有 JSX/TSX 文件打包为可被 txiki.js 执行的纯 JavaScript 文件。

3.3 运行 Demo

# 默认运行 widgets 示例makedemo# 运行其他 demomakedemoPROJECT=hello_worldmakedemoPROJECT=calculator

也可以手动指定路径:

./build/lvgljs run demo/widgets/index.js

3.4 热重载开发模式

同时打开两个终端窗口:

# 终端 1:监视 JSX 文件变化,自动重新打包npmrun bundle:watch# 终端 2:监视编译产物变化,自动重新运行npmrun sim:watch -- demo/widgets/index.js

四、项目结构一览

lvgljs/ ├── CMakeLists.txt # C++ 构建配置 ├── Makefile # 便捷构建入口 ├── build.js # esbuild JS 打包脚本 ├── package.json # npm 依赖配置 │ ├── src/ │ ├── engine/ # C++ 应用入口 │ │ ├── engine.cpp # main():初始化 txiki.js + 暴露 lvgljs 对象 │ │ └── hal/ │ │ ├── simulator/ # SDL2 模拟器 HAL │ │ └── device/ # 嵌入式 framebuffer HAL │ │ │ └── render/ │ ├── native/ # C++ LVGL 绑定层 │ │ ├── bootstrap/ # 初始化所有组件/事件绑定 │ │ └── components/ # 各个 LVGL 组件的 C++ 包装 │ └── react/ # JavaScript UI 框架 │ ├── core/ # Reconciler、样式、动画、主题 │ └── components/ # Button、Text、View 等 React 组件 │ ├── deps/ │ ├── lvgl/ # LVGL 图形库(子模块) │ ├── lv_drivers/ # LVGL 驱动(子模块) │ └── txiki/ # txiki.js 运行时(子模块) │ ├── demo/ │ ├── widgets/ # 组件展示 demo │ ├── hello_world/ # 入门 hello world │ └── calculator/ # 计算器 demo │ └── doc/ # 详细文档 ├── build/ # 构建指南 ├── component/ # 各组件 API 文档 └── style/ # CSS 样式文档

五、编写自己的 UI

项目提供了类似 React 的组件化接口。使用前确保npm run bundle已执行过(或者开bundle:watch),然后编写 JSX 文件:

import { Button, Render, Text, View } from "lvgljs-ui"; import React from "react"; function App() { return ( <View style={{ "background-color": "#1a1a2e", "flex-direction": "column", "align-items": "center", "justify-content": "center" }}> <Text style={{ color: "#ffffff", "font-size": 24 }}> Hello lvgljs! </Text> <Button style={{ "margin-top": 20, "background-color": "#e94560" }}> <Text>Click Me</Text> </Button> </View> ); } Render.render(<App />);

将文件放到demo/myapp/index.jsx,运行:

npmrun bundle ./build/lvgljs run demo/myapp/index.js

六、可能遇到的问题

问题解决方案
Could NOT find CURLsudo apt install libcurl4-openssl-dev
Could NOT find SDL2sudo apt install libsdl2-dev
LIBTOOL is undefinedsudo apt install libtool autoconf automake
makeinfo: command not foundsudo apt install texinfo
quickjs ... discarded-qualifiersMakefile cmake 命令加-DCMAKE_C_FLAGS=-Wno-error=discarded-qualifiers
unterminated-string-initialization同上,加-Wno-error=unterminated-string-initialization
libffi configure failedcmake 命令加-DUSE_EXTERNAL_FFI=ON+sudo apt install libffi-dev

七、总结

整个流程可以归纳为 4 条命令:

# 1. 安装依赖(一次性)sudoaptinstallgitcmake nodejsnpmlibsdl2-dev libcurl4-openssl-dev\libffi-dev libtool autoconf automake texinfo# 2. 拉取代码和子模块,网络不好的话自己想办法gitclone https://github.com/lvgl/lv_binding_js.git&&cdlv_binding_jsgitsubmodule update--recursive--init# 3. 安装 JS 依赖npminstall# 4. 编译 + 打包 + 运行makesimulator&&npmrun bundle&&makedemo

修改 Makefile 这一步只在 CMake 4.x + Ubuntu 最新版系统上需要。如果是较老版本的 CMake(3.16~3.28),项目原生的 Makefile 应该是可以直接使用的,make setup && make simulator即可成功编译。

http://www.zskr.cn/news/1429413.html

相关文章:

  • 2026金属花箱多少钱?影响价格的关键因素解析
  • 【RT-DETR实战】098、Web端部署实战:当RT-DETR遇上TensorFlow.js的坑与解法
  • 2026四川成都+峨眉山+乐山大佛6天5晚导游推荐|口碑路线分析 - 随峰国旅
  • AI驱动ERP自动单据识别、预测补货、动态定价——手把手部署Llama-3+Odoo 17全流程
  • 2026这6款硬核降AI率平台大曝光,一键把AI检测率精准控到安全区! - 降AI小能手
  • 基于ESP32的智能纸浆机DIY:从电路设计到3D打印全流程
  • 研发团队用的轻量工时+原型+效果图一体化协同系统(SpringBoot+Vue)
  • 2026四川成都+乐山大佛+峨眉山5天4晚导游排名|无购物口碑分析 - 随峰国旅
  • Opus 4.8发布,Anthropic估值正式超越 OpenAI
  • Markn:重新定义Markdown编辑体验的轻量级实时预览工具
  • 郑州门联柜工厂,郑州致远门业工厂直发
  • 2026四川九寨沟+黄龙+四姑娘山7天6晚导游TOP榜|纯玩实测与避坑解析 - 随峰国旅
  • HS2-HF Patch:高效解锁Honey Select 2完整汉化与功能增强的实用指南
  • 2026 年长沙门窗怎么选? - 涂伟
  • 2026四川稻城亚丁情侣游导游排名|纯玩口碑分析+避坑攻略 - 随峰国旅
  • 租赁中介用什么中介房源管理系统合适
  • 窗户干净脏污分类窗户清洁状态分类数据集3299张2类别已划分训练验证测试集
  • 2026年天津除甲醛哪家好?本地人实测推荐 - 资讯纵览
  • 如何快速配置英雄联盟Akari助手:新手的完整智能游戏助手指南
  • Minecraft MASA模组全家桶汉化包终极指南:如何快速解决中文界面难题
  • ARM服务器启动探秘:从ATF BL2到UEFI,那些硬件初始化代码都藏在哪里?
  • 【独家披露】头部电商AI-A/B系统压测报告:单日亿级流量下,模型变异率<0.008%的5项硬核保障
  • 嵌入式开发实战:基于Raspberry Pi Pico的边沿检测与按键消抖技术详解
  • OpenCore配置终极解决方案:OCAuxiliaryTools完整指南
  • 2026推荐榜:大连奢侈品黄金名表回收靠谱排名TOP5 - 资讯纵览
  • 2026年5月最新|无锡GEO优化公司排名榜单,实地测评帮企业优选靠谱服务商 - 商业新知
  • 基于华为ENSP系统实现DHCP基础实验的操作步骤
  • 从CAPWAP隧道到VSL链路:一张图看懂锐捷无线AC冗余的底层通信逻辑与配置核心
  • 微信转账到零钱又改了,是好消息,也是坏消息
  • 3分钟终极优化:用Win11Debloat让你的Windows 11重获新生