在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
英文地址,請注明出處:http://en.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…