在Linux中创建LVGL应用

在Linux中创建LVGL应用

简介

上一篇文章介绍了在imx6上开发UI的流程 .
这篇接上文, 介绍具体的开发步骤。

1. 创建项目主目录

mkdir my_lvgl_project
cd my_lvgl_project

2. 初始化 Git 仓库 (可选但推荐)

git init
echo "# My Project with Dependencies" > README.md
git add README.md
git commit -m "Initial commit: Add README"

3. 添加LVGL源码

这里有2种方式:

  • 将lvgl仓库作为整个工程的子模块(推荐)
  • 直接将LVGL源代码加入到工程中

3.1 添加 LVGL 作为子模块

git submodule add https://github.com/lvgl/lvgl.git

然后git开始下载
在这里插入图片描述
下载完成后查看git状态
在这里插入图片描述
这里有两个关键变化:

  1. .gitmodules 文件:这是一个新创建的配置文件,它记录了你的项目包含了哪些子模块,以及它们的 URL 和本地路径。
[submodule "lvgl"]path = lvglurl = https://github.com/lvgl/lvgl.git
  1. lvgl 目录:这是 lvgl 仓库被克隆下来的地方。它看起来像一个普通目录,但它实际上是一个独立的 Git 仓库。
    现在,提交这次变更:
git commit -m "feat: Add lvgl as a submodule"

3.2 直接从其他地方复制LVGL源码到工程目录

4. 创建工程文件

4.1 lv_conf.h文件

从LVGL源码里复制lv_conf_template.h 为lv_conf.hmkdir src
cd src
copy …/lvgl/lv_conf_template.h ./lv_conf.h

使能整个文件
在这里插入图片描述

4.2 应用程序文件

创建 lvgl_ui.c: 为了兼容ubuntu和imx6ull两个平台, 这里使用了宏定义来区分。

#include "lv_conf.h"
#include "lvgl.h"
#if LV_USE_SDL
#include "src/drivers/sdl/lv_sdl_window.h"
#endif
#if LV_USE_LINUX_FBDEV
#include "src/drivers/display/fb/lv_linux_fbdev.h"
#endif
#include <stdio.h>
#include <unistd.h>#ifndef FRAMEBUF_DEV_PATH
#define FRAMEBUF_DEV_PATH  "/dev/fb0"
#endiflv_display_t * disp;int main(void)
{// 1. 初始化 LVGLlv_init();
#if LV_USE_SDL// 2. 初始化 SDL 显示驱动disp = lv_sdl_window_create(800, 480);  // 设置窗口大小
#endif
#if LV_USE_LINUX_FBDEV// 2. 初始化 LVGL 显示驱动lv_linux_fbdev_set_file(disp, FRAMEBUF_DEV_PATH);
#endif// 3. 创建测试对象lv_obj_t * label = lv_label_create(lv_scr_act());char buf[100] = {0};sprintf(buf, "Hello, Ubuntu & LVGL(%s: V%d.%d.%d)!", LVGL_VERSION_INFO, LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);lv_label_set_text(label, buf);lv_obj_center(label);// 4. 主循环while(1) {lv_timer_handler();usleep(5000);}return 0;
}
4.3 创建CMakeList.txt 和 build文件夹
4.3.1 Ubuntu 上运行LVGL的必要设置

在 Ubuntu 上运行 LVGL 应用时,使用 SDL (Simple DirectMedia Layer) 作为显示驱动是一个非常棒的选择,尤其是在开发和调试阶段。SDL 允许 LVGL 在一个桌面窗口中渲染,而不需要配置物理帧缓冲设备(/dev/fb0),这大大简化了开发流程。

  • 安装 SDL 及其开发库
#1. 更新包管理器的列表 
sudo apt update# 2. 安装 SDL2 开发库 
sudo apt install -y libsdl2-dev
  • 启用 SDL 驱动
    可以在CMakeList里设置, 也可以在代码里设置
#define LV_USE_SDL 1
  • Ubuntu 的 CMakeList.txt
# run below command to build project for Ubuntu
# cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..# CMake 最低版本要求
cmake_minimum_required(VERSION 3.15)# 定义项目名称和版本
project(MyLVGLProject VERSION 1.0.0 LANGUAGES C CXX)# 设置 C 标准
set(CMAKE_C_STANDARD 99)# --- 编译选项 ---
# 添加Ubuntu所需的编译选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -O2")# --- 包含目录 ---
# 包含 LVGL 头文件
include_directories(${PROJECT_SOURCE_DIR}/lvgl)
include_directories(${PROJECT_SOURCE_DIR}/src)
# 添加SDL2头文件目录
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
include_directories(${SDL2_INCLUDE_DIRS})# --- 源文件定义 ---# 1. LVGL 源文件
file(GLOB_RECURSE LVGL_SOURCES "lvgl/src/*.c")# 2. LVGL 驱动源文件
file(GLOB_RECURSE DRIVERS_SOURCES "lv_drivers/src/*.c")# 3. 应用程序源文件
file(GLOB APP_SOURCES "src/*.c")# --- 可执行文件 ---add_executable(my_app_ubuntu${LVGL_SOURCES}${DRIVERS_SOURCES}${APP_SOURCES}
)# --- 链接库和依赖 ---
# 添加Ubuntu系统所需的库
target_link_libraries(my_app_ubuntu${SDL2_LIBRARIES}pthreadrtmdl
)# --- LVGL配置 ---
target_compile_definitions(my_app_ubuntu PRIVATELV_CONF_INCLUDE_SIMPLE# 添加SDL驱动支持LV_USE_SDL=1LV_USE_LINUX_FBDEV=0# 设置显示分辨率LV_HOR_RES_MAX=800LV_VER_RES_MAX=480# 设置颜色深度LV_COLOR_DEPTH=16
)# --- Ubuntu特定配置 ---
if(UNIX AND NOT APPLE)# 针对Linux/Unix系统的配置target_compile_definitions(my_app_ubuntu PRIVATEUSE_SDL=1MY_DISP_FLUSH_LINUX)
endif()# --- 打印信息 ---
message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
message(STATUS "SDL2_INCLUDE_DIRS: ${SDL2_INCLUDE_DIRS}")
message(STATUS "SDL2_LIBRARIES: ${SDL2_LIBRARIES}")
4.3.2 Imx6 上运行LVGL的必要设置
  • 启用 framebuffer device 驱动
    可以在CMakeList里设置, 也可以在代码里设置
#define LV_USE_LINUX_FBDEV 1
  • 屏幕尺寸被代码里固定了, 可以通过修改源代码来修改尺寸
lvgl/src/drivers/display/fb/lv_linux_fbdev.c: lv_linux_fbdev_create
  • imx6 的 CMakeList.txt
# before run cmake .., cross-compile environment should be set
# e.g.
#"source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi"# CMake 最低版本要求
cmake_minimum_required(VERSION 3.15)# 定义项目名称和版本
project(MyLVGLProject VERSION 1.0.0 LANGUAGES C CXX)# 设置 C 标准
set(CMAKE_C_STANDARD 99)# --- 编译选项 ---
# 如果你的平台需要特殊的编译器标志,可以在这里添加
# 例如,为 ARM 交叉编译添加:
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfloat-abi=hard")# --- 包含目录 ---
# 包含 LVGL 头文件
include_directories(${PROJECT_SOURCE_DIR}/lvgl)
include_directories(${PROJECT_SOURCE_DIR}/src)# --- 源文件定义 ---# 1. LVGL 源文件
# 使用 GLOB_RECURSE 递归查找所有 .c 文件
file(GLOB_RECURSE LVGL_SOURCES "lvgl/src/*.c")# 打印找到的文件列表,用于调试和验证
message(STATUS "Found sources in A and its subdirectories:")
foreach(source ${LVGL_SOURCES})message(STATUS "  - ${source}")
endforeach()# 2. LVGL 驱动源文件
# file(GLOB_RECURSE DRIVERS_SOURCES "lv_drivers/src/*.c")# 3. 应用程序源文件
file(GLOB APP_SOURCES "src/*.c")# --- 可执行文件 ---# add_executable 定义最终要生成的可执行文件
# 它将所有源文件链接在一起
add_executable(my_app_imx6${LVGL_SOURCES}${DRIVERS_SOURCES}${APP_SOURCES}
)# --- 链接库和依赖 ---# 如果你的应用程序需要链接其他库(如 pthread, rt 等),在这里添加
# 例如,如果需要实时时钟支持:
target_link_libraries(my_app_imx6 pthread rt)# --- (可选但推荐) 手动定义 LV_CONF_INCLUDE_SIMPLE ---
# 虽然根据 LVGL 的逻辑,如果路径正确,它会自动定义。
# 但在 CMake 中显式地定义它,可以增强构建系统的明确性和可预测性。
# 它覆盖了 LVGL 的自动检测,强制使用简单包含模式。
# 这是一种防御性编程,确保即使 LVGL 的自动检测在某些边缘情况下失败,我们的构建依然稳定。
target_compile_definitions(my_app_imx6 PRIVATELV_CONF_INCLUDE_SIMPLE# 添加SDL驱动支持LV_USE_SDL=0LV_USE_LINUX_FBDEV=1
)# --- 特定平台配置 ---# 这是一个示例,展示如何为不同平台进行配置
# 你可以根据你的实际需求修改这部分
if(UNIX AND NOT APPLE)# 针对 Linux/Unix 系统的配置# 假设你的显示刷新函数在 src/my_disp_flush.c 中# 并且你定义了一个宏来启用它target_compile_definitions(my_app_imx6 PRIVATE MY_DISP_FLUSH_LINUX)# 假设你使用了特定的库,如 libinput# find_package(PkgConfig REQUIRED)# pkg_check_modules(LIBINPUT REQUIRED libinput)# target_link_libraries(my_app_imx6 ${LIBINPUT_LIBRARIES})# target_include_directories(my_app_imx6 PRIVATE ${LIBINPUT_INCLUDE_DIRS})
endif()# if(DEFINED ENV{CMAKE_TOOLCHAIN_FILE})
#     # 如果定义了交叉编译工具链文件,则应用它
#     include($ENV{CMAKE_TOOLCHAIN_FILE})
# endif()# --- 打印信息 (可选,用于调试) ---
message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")

最终文件结构:
my_lvgl_project/
├── CMakeLists.txt # 根 CMake 配置文件
├── CMakeLists.txt-imx6ull # imx6ull的 CMake 配置文件
├── CMakeLists.txt-ubuntu #ubuntu 的 CMake 配置文件
├── lvgl/ # LVGL 源码目录 (可以是子模块或直接下载)
├── src/ # 你的应用程序源码目录
│ ├── lvgl_conf.h
│ ├── lvgl_ui.c
└── build/ # 构建目录 (将在外部创建)

5. 编译

5.1 编译Ubuntu的应用

5.1.1 指定gcc作为编译工具
cd build
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
make -j4

在这里插入图片描述

5.1.2. 编译完成后,运行

在这里插入图片描述

5.2 编译imx6ull的应用

5.2.1 source交叉编译工具
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-
poky-linux-gnueabi

5.2.2 验证交叉编译工具是否正确

echo $CC
echo $CXX

在这里插入图片描述

5.2.3 cmake imx工程

在这里插入图片描述

5.2.4 编译(待验证)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91802.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型对比评测:Qwen2.5 VS Gemini 2.0谁更能打?

一、背景与选型关键 在 AI 应用落地的时代&#xff0c;“AI大模型选型对比”成为关键环节。选择合适的模型要综合考量性能、上下文长度、推理能力、中文/编程支持、成本等多维度指标。 本文重点比较 Gemini2.0Flash-Lite &#xff08;Preview&#xff09;、Gemini2.0Flash &a…

转置卷积解释与示例计算

文章目录转置卷积的三种等价实现方法&#xff1a;原理、公式与等价性分析数学定义与核心公式方法一&#xff1a;零填充翻转核卷积&#xff08;数学定义方法&#xff09;原理与公式等价性说明方法二&#xff1a;直接位置映射&#xff08;pytorch框架高效实现&#xff09;原理与公…

关于车位引导及汽车乘梯解决方案的专业性、系统性、可落地性强的综合设计方案与技术实现说明,旨在为现代智慧停车楼提供高效、安全、智能的停车体验。

一、系统概述随着城市土地资源日益紧张&#xff0c;立体停车、自动化停车成为发展趋势。本方案围绕“车位引导系统 汽车乘梯系统”构建智慧停车核心体系&#xff0c;结合地磁/视频/超声波检测、AI识别、语音交互、电梯自动调度等先进技术&#xff0c;实现车辆入场、引导、停泊…

【相机】曝光时间长-->拖影

曝光时间长 → 运动目标在快门开启期间持续移动 → 同一像素记录多个位置的能量 → 图像出现“拖影”&#xff08;运动模糊&#xff09;。&#x1f50d; 具体原因卷帘快门&#xff08;Rolling Shutter&#xff09;效应 RealSense 的 RGB 传感器&#xff08;如 IMX 系列&#xf…

day36 力扣1049.最后一块石头的重量II 力扣494.目标和 力扣474.一和零

最后一块石头的重量II有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#…

Java内存模型(Java Memory Model,JMM)

​​ JMM​​ 是Java虚拟机&#xff08;JVM&#xff09;规范中定义的一组规则和规范&#xff0c;用于描述多线程环境下&#xff0c;Java程序中变量的访问和修改行为&#xff0c;尤其是在并发编程中如何保证内存可见性、原子性和有序性。JMM 是 Java 并发编程的基石&…

【swoole Windows 开发(swoole-cli 开发 hyperf)】

先前swoole在Windows平台的开发体验极差&#xff0c;如果在Windows开发swoole的东西可以用docker或者虚拟机&#xff0c;远程开发&#xff0c;体验比较好的是直接Mac或者Linux系统开发。但是作为window平台的钉子户表示我穷。swoole之前已经推出了cygwin64编译成winwods版本的方…

兴达餐饮 酒店 进销存管理系统软件

兴达餐饮 酒店 进销存管理系统软件

Seal Report:一款免费开源的报表工具

Seal Report 是一款基于 C# 语言开发的开源报表工具&#xff0c;可以从各种数据库或 NoSQL 数据源中生成日常报告&#xff0c;并且执行复杂的计划任务。 功能特性 免费开源&#xff1a;源代码托管在 GitHub 上&#xff0c;用户可以自由使用、修改、甚至集成到自己的系统中&…

WebRTC 多媒体 SDP 示例与解析

webRTC中的SDP的Bundlle可能包含一个或者多个媒体块&#xff08;媒体描述, 源码对应类ContentInfo&#xff09;&#xff0c;从 m 开始到下一个 m 行&#xff08;或 SDP 结束&#xff09;之间的所有属性&#xff08;包括 a&#xff09;都属于同一个媒体块&#xff08;media sect…

SpringBoot 启动富文本文字更改

正常来说 SpringBoot启动时候&#xff0c;展示的文字是这个 、 主播这边想要换一个样式&#xff0c;换一个自己自定义的文字 这边换成了自己的博客名字 具体实现操作如下 在项目目录 resources下创建一个名字为banner.txt的文本&#xff0c;这是SpringBoot启动的时候寻找的…

基于结构熵权-云模型的铸铁浴缸生产工艺安全评价

一、评价模型核心思想 结构熵权法 解决传统熵权法忽略指标间结构关系的问题,通过指标层次网络计算权重。 步骤: 构建工艺安全评价指标体系(树状/网络结构) 计算同级指标间的影响度矩阵 引入修正熵权:wj=1−Ej∑(1−Ek)结构影响因子w_j = \frac{1 - E_j}{\sum (1 - E_k)} \…

[Linux]从零开始的vs code交叉调试arm Linux程序教程

一、前言 最近的项目中需要集成rknn的视觉识别&#xff0c;在这之前我并且没有将rknn集成到自己项目的经验。这里我需要在rknn原本demo的基础上我还需要集成自己的业务代码。但是又有一个问题&#xff0c;原本rknn我们都是使用交叉编译编译到开发板上的&#xff0c;并且我们还要…

视频号私信自动化回复插件

给自己的浏览器插件又增加了视频号斯信的自动化回复搜索&#xff1a;程序员老狼主体逻辑就是&#xff0c;不停的点击打招呼和斯信那个tab切换查看有无小红点&#xff0c;有小红点的会话&#xff0c;就点击。查看有无打招呼&#xff0c;有打招呼就点击&#xff0c;抓取昵称和内容…

Web前端实现银河粒子流动特效的3种技术方案对比与实践

文章目录 前端实现银河粒子流动特效的技术原理与实践 引言:银河粒子特效的技术背景与现状 技术发展历史 当前技术现状 技术原理与实现方案 思维导图:银河粒子特效技术架构 1. CSS3实现方案 基础实现代码 性能优化技巧 2. Canvas 2D实现方案 基础实现代码 Canvas高级优化技术 …

Linux:告别Jammy,拥抱Noble!WSL Ubuntu 22.04 到 24.04 LTS 终极升级指南

大家好&#xff01;如果大家和我一样&#xff0c;是Windows Subsystem for Linux (WSL) 的忠实用户&#xff0c;那么大家一定对Ubuntu在其中的表现印象深刻。我们中的许多人可能还在使用稳定可靠的Ubuntu 22.04 LTS (Jammy Jellyfish)。但现在&#xff0c;一个更令人兴奋的时代…

江协科技STM32 11-1 SPI通信协议

本节课我们将继续学习下一个通信协议&#xff0c;SPI。SPI通信和我们刚刚学习过的I2C通信差不多。两个协议的设计目的都一样都是实现主控芯片和各种外挂芯片之间的数据交流&#xff0c;有了数据交流的能力&#xff0c;我们的主控芯片就可以挂载并操纵各式各样的外部芯片&#x…

预过滤环境光贴图制作教程:第一步 - HDR 转立方体贴图

在基于物理的渲染(PBR)中,环境光贴图是实现真实光照效果的核心组件之一。而将 HDR 全景图转换为立方体贴图,是制作预过滤环境光贴图的基础步骤。本教程将详细讲解如何实现这一转换过程。 什么是 HDR 转立方体贴图? HDR(高动态范围)全景图通常以等矩形投影(Equirectan…

02 深度学习介绍【动手学深度学习v2】| 学习笔记

1、intro自然语言处理虽然我们过去取得了很大的进展&#xff0c;但是实际上还是停留在感知层面。计算机视觉领域&#xff0c;因为图片里面都是像素&#xff0c;像素很难用符号学来解释&#xff0c;所以计算机视觉大部分是用概率模型或机器学习来做。深度学习它是机器学习的一种…

智能学号抽取系统V5.6.4重磅发布

告别随机数&#xff0c;拥抱智能点名&#xff01;—— 全新升级的“智能学号抽取系统V5.6.4”重磅发布&#xff01; 摘要&#xff1a; 还在为课堂随机提问、活动抽奖而手动翻名单、查表格而烦恼吗&#xff1f;还在忍受传统点名工具的简陋和不智能吗&#xff1f;今天&#xff0…