【lvgl】01-lvgl移植之在linux上跑
前言
本次笔记主要记录博主移植lvgl到linux上的过程,方便调试。
两种编译方式:
- 移植官方推荐的lvgl,基于linux SDL2,makefile编译方式。
- 另外还会分别移植lvgl v8.0 和 lvgl v8.3两个版本。都是基于SDL2多媒体框架和CMAKE编译。
- lvgl v8.3版本后面有时间再整理出来。
参考:
linux安装SDL2
sudo apt-get update && sudo apt-get install -y build-essential libsdl2-dev
官方推荐
参考:
- Simulator project for LVGL embedded GUI Library:https://github.com/lvgl/lv_port_pc_vscode
拉取lvgl PC 模拟子模块vscode sdl:
git clone --recursive https://github.com/lvgl/lv_sim_vscode_sdl
下载完如下图:

然后直接make:
make
转到lv_sim_vscode_sdl/build/bin执行demo固件即可:
./demo
结果如图:

如果上述clone下面这三个库时较慢,可以手动下载库文件,再复制到lv_sim_vscode_sdl目录下对应的目录中:(选同一版本)
lvgl库下载 :https://github.com/lvgl/lvgl.git
lvgl_drivers库下载 :https://github.com/lvgl/lv_drivers.git
lv_examples库下载 :https://github.com/lvgl/lv_examples.git
移植lvgl v8.0
打算搭建自己学习、调试lvgl的SDK,用CMAKE编译,所以就自己手把手构建SDK和移植lvgl。
目录框架
目录构建如下:
- app:专门存放学习、调试的UI app程序。
- build:用于编译。
- lib:第三方库。
- src:主要起始文件,如main.c。
- ui:lvgl源码、lvgl驱动等UI库文件。
- CMakeLists.txt:cmake编译顶层文件。

拉取lvgl
进入ui文件夹,clone两个库:
git clone -b release/v8.0 https://github.com/lvgl/lvgl.git
git clone -b release/v8.0 https://github.com/lvgl/lv_drivers.git


添加lv_conf.h和lv_drv_conf.h配置文件
lv_conf.h
添加lv_conf.h:在lvgl目录下
cp lv_conf_template.h lv_conf.h
使能该文件:改成1
#if 1 /*Set it to "1" to enable content*/
lv_drv_conf.h
- 添加lv_drv_conf.h:在lvgl目录下
cp lv_drv_conf_template.h lv_drv_conf.h
- 使能该文件:改成1
#if 1 /*Set it to "1" to enable content*/
开启SDL需要的宏:
- 把
USE_MONITOR宏改成1。我们用monitor来模拟。 USE_MOUSE改成1。用到鼠标。USE_MOUSEWHEEL改成1。鼠标滚轮也用到。USE_KEYBOARD改成1。用到键盘。
- 把
构建main.c
可以直接拷贝
lv_sim_vscode_sdl/main/src/m*。- 我把该目录下的两个文件都cp过来了。
main.c把头文件改成如下:
/*********************
* INCLUDES
*********************/
#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdlib.h>
#include <unistd.h>
#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/
#include <SDL2/SDL.h>
#include "lvgl.h"
#include "examples/lv_examples.h"
#include "monitor.h"
#include "mouse.h"
#include "keyboard.h"
#include "mousewheel.h"
main.c把lv_demo_widgets();demo注释掉。mouse_cursor_icon.c的头文件改成:
#include "lvgl.h"
构建自己的CMAKE
lvgl 8.0版本我打算全盘使用自己构建的cmake。
lvgl 8.3版本我打算兼容原生库的构建的cmake。
顶层目录下的cmake:
cmake_minimum_required(VERSION 3.0.0)
set(target lzm_lvgl_test_bin)
project(${target} VERSION 0.1.0)
set(src_lvgl_test
src/main.c
src/mouse_cursor_icon.c
)
add_executable(${target} ${src_lvgl_test})
include_directories(/usr/include)
target_link_libraries(${target} PRIVATE lzm_lvgl_lib lzm_lvgl_drv_lib)
target_link_libraries(${target} PRIVATE SDL2)
add_subdirectory(ui)
./ui:
target_compile_definitions(${target} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE")
target_compile_definitions(${target} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE")
add_subdirectory(lvgl)
add_subdirectory(lv_drivers)
./ui/lvgl:
set(target lzm_lvgl_lib)
add_library(${target} STATIC)
target_compile_definitions(${target} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE")
target_compile_definitions(${target} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE")
target_include_directories(${target} PUBLIC ./)
target_include_directories(${target} PUBLIC ./src)
target_include_directories(${target} PUBLIC ./src/core)
target_include_directories(${target} PUBLIC ./src/draw)
target_include_directories(${target} PUBLIC ./src/extra)
target_include_directories(${target} PUBLIC ./src/font)
target_include_directories(${target} PUBLIC ./src/gpu)
target_include_directories(${target} PUBLIC ./src/hal)
target_include_directories(${target} PUBLIC ./src/misc)
target_include_directories(${target} PUBLIC ./src/widgets)
# app include
target_include_directories(${target} PUBLIC ./examples)
# app src
file(GLOB_RECURSE src_lvgl_app examples/*.c)
file(GLOB_RECURSE src_lvgl src/*.c)
target_sources(${target} PRIVATE
${src_lvgl}
${src_lvgl_app}
)
./ui/lv_drivers:
set(target lzm_lvgl_drv_lib)
add_library(${target} STATIC)
target_link_libraries(${target} PUBLIC lzm_lvgl_lib)
target_include_directories(${target} PUBLIC ./)
target_include_directories(${target} PUBLIC ./display)
target_include_directories(${target} PUBLIC ./gtkdrv)
target_include_directories(${target} PUBLIC ./indev)
target_include_directories(${target} PUBLIC ./wayland)
target_include_directories(${target} PUBLIC ./win32drv)
file(GLOB_RECURSE src_lvgl_drv ./*.c)
target_sources(${target} PRIVATE
${src_lvgl_drv}
)
编译
- 在./build路径下进行
cmake ..:结果如下,Makefile创建成功:
jamie@lzm-vm-linux:~/work/study/lvgl/lzm_lvgl_v8.0/build$ cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jamie/work/study/lvgl/lzm_lvgl_v8.0/build
jamie@lzm-vm-linux:~/work/study/lvgl/lzm_lvgl_v8.0/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile ui
- 然后直接make,遇错就改:
jamie@lzm-vm-linux:~/work/study/lvgl/lzm_lvgl_v8.0/build$ make
[ 90%] Built target lzm_lvgl_lib
Consolidate compiler generated dependencies of target lzm_lvgl_drv_lib
[ 98%] Built target lzm_lvgl_drv_lib
Consolidate compiler generated dependencies of target lzm_lvgl_test_bin
[ 98%] Building C object CMakeFiles/lzm_lvgl_test_bin.dir/src/mouse_cursor_icon.c.o
[ 99%] Linking C executable lzm_lvgl_test_bin
[100%] Built target lzm_lvgl_test_bin
jamie@lzm-vm-linux:~/work/study/lvgl/lzm_lvgl_v8.0/build$
- 执行:
jamie@lzm-vm-linux:~/work/study/lvgl/lzm_lvgl_v8.0/build$ ./lzm_lvgl_test_bin
【lvgl】01-lvgl移植之在linux上跑的更多相关文章
- Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?
Python3.7.2,在Linux上跑来跑去的,是在升级打怪么? 前不久,发布了Python在Windows(程序员:Python学不学?完全没必要纠结)和Mac OS(我是Python,P派第 ...
- Linux上跑两个版本的php,5.4.45和5.3.24
首先,装的实在艰难,所以容我吐槽两句: PHP好个P,两个小版本都不兼容,把这个php5.3.24放在5.4.45环境下都跑不了.对于我这种用多了向下兼容的java的人来说,简直无法想象! 网上有装俩 ...
- .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了
上一章回顾: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...
- 让asp.net和php同时在Linux上跑起来
实现这个想法有很多种方法,我就我最近算是比较熟悉的方式来说给大家吧. 因为有了mono,所以.net才能跨平台,.net都跨平台了,.net平台的童鞋们是不是应该提起精神好好了解下mono呢? 当然了 ...
- Linux上跑MySQL优化技巧
1.禁止操作系统更新文件的atime属性 atime是Linux/UNIX系统下的一个文件属性,每当读取文件时,操作系统都会将读操作时间回写到磁盘上.对于读写频繁的数据库文件来说,记录文件的访问时间一 ...
- 不装mono,你的.NET程序照样可以在Linux上运行!
让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过”mono your.exe“命令运行这个程序. 这种运行.net程序的办法有两个弱点,一个是需要客户机安装 ...
- C#在Linux上的开发指南
本人才疏学浅,在此记录自己用C#在Linux上开发的一点经验,写下这篇指南.(给想要在Linux上开发C#程序的朋友提供建议) 目前在Linux上跑的网站:http://douxiubar.com | ...
- C#在linux上运行实现
1 C#开发完了服务 2 部署到linux centos7上 3无法直接运行 解决方法 1 linux cenos7上安装mono 2 执行mono xxx.exe 即可 解决方法2 下载 anye ...
- linux上实现jmeter分布式压力测试(转)
摘要:最近根据公司工作的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试.下面就记录下近期的学习.我想将这次的博文分成三个部分:1.开始测试前的准备(测试环境的搭建)2.在一 ...
- (原创)在Linux上安装运行Python3(CentOS7为例)
在win10上开发好的python项目要部署在Linux上要面对的问题:怎么在Linux上跑py文件呢? 以Lunix CentOS7.x平台为例,CentOS系统上自带的已有python2.x 的版 ...
随机推荐
- 给ShardingSphere提了个PR,不知道是不是嫌弃我
说来惭愧,干了 10 来年程序员,还没有给开源做过任何贡献,以前只知道嘎嘎写,出了问题嘎嘎改,从来没想过提个 PR 去修复他,最近碰到个问题,发现挺简单的,就随手提了个 PR 过去. 问题 问题挺简单 ...
- Zookeeper及基于Zookeeper的分布式锁总结
1. Zookeeper ZooKeeper 内部存储的数据结构 / +-- node1 +-- node2 | +-- sub_node21 -> "I am sub_node21& ...
- React Native入门 Enable live Reload
在开发项目时,有时一点点小修改就需要重新编译,打包,安装,效率比较低 RN 提供了一种实时重载 (Enable live Reload)的方式,来实现快速的调试开发,修改保存后会立刻载真机或模拟器中显 ...
- LFS(Linux From Scratch)构建过程全记录(七):进入Chroot并构建临时工具
写在前面 本章将完成临时系统构建的最后缺失部分和各种包构建所需的工具. 解决了所有循环依赖关系后,就可以使用与主机操作系统完全隔离的"chroot"环境进行构建. 注意:接下来的指 ...
- 【loj2538】 【PKUWC 2018】Slay the Spire dp
我们不难发现,假设抽了x张攻击牌,y张强化牌,那么肯定是打出尽可能多张的强化牌后,再开始出攻击牌(当然最少要一张攻击牌) 我们设G(i,j)表示:所有(抽到的攻击牌牌数为i,打出的攻击牌牌数为j)的方 ...
- uniapp|微信小程序获取当前城市名称--逆地址解析
六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验 关注博主不迷路~ 问题 uniapp开发的小程序需要获取当前城市名称 解决步骤 看文档 当然是看uniapp文档,我 ...
- vscode常用快捷键及插件
macOS 全局 Command + Shift + P / F1 显示命令面板 Command + P 快速打开 Command + Shift + N 打开新窗口 Command + W 关闭窗口 ...
- 关于MongoDB副本集和分片集群有关用户和权限的说明分析
1.MongoDB副本集 可以先创建超管用户,然后再关闭服务,创建密钥文件,修改配置文件,启动服务,使用超管用户登录验证,然后创建普通用户 2.MongoDB分片集群 先关闭服务,创建密钥文件,修改配 ...
- @property装饰器和property()函数
@property装饰器 Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式. class Peopl ...
- Opengl ES之纹理贴图
纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上.一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据. 所谓的纹理贴图,就是使用Opengl将 ...