ubuntu linux搭建lvgl

记录一下ubuntu linux搭建 lvgl的过程

本地环境:ubuntu 16.04

ubuntu + lvgl + sdl2

1 获取源码

c 复制代码
git clone https://github.com/lvgl/lv_port_linux.git
cd lv_port_linux/
git submodule update --init --recursive

查看分支:
git branch -a

我选择的是9.2(master分支一直在变动,可能不安全,我们需要一个稳定的版本)
git checkout remotes/origin/release/v9.2 -b v92
git branch -a

为了保险起见,切完分支后,更新下子模块.
git submodule update --init --recursive

2 改 lv_conf.h

lv_conf.h文件就在根目录下.

修改下面三个宏,需要将LV_USE_LINUX_FBDEV => 0 SDL=>1

c 复制代码
#define LV_USE_LINUX_FBDEV	0
#define LV_USE_LINUX_DRM	0
#define LV_USE_SDL		    1

953: LV_SDL_BUF_COUNT 2

3 编译

c 复制代码
mkdir build
cd build 
cmake ..
make -j

问题1 :cmake版本过低,没有办法,自己去升级一下.
cmake版本升级方法

继续:

问题2 :cmake 报错 缺少sdl模块,安装一下:
sudo apt-get update && sudo apt-get install -y build-essential libsdl2-dev

最后还有问题 :
FindSDL2_image 模块找不到
CMake Error at CMakeLists.txt:13 (add_executable): Target "main" links to item "-L/usr/lib/x86_64-linux-gnu -lSDL2 " which has leading or trailing whitespace. This is now an error according to policy CMP0004.

安装一下吧:
sudo apt-get install libsdl2-image-dev

但是安装之后还是报错.

原因 : 因为sdl2安装包里面有cmake,但是sdl2_iamge木有cmake,就导致SDL2_image找不到.

解决:修改CMakeLists.txt(根目录下的).

将find_package(SDL2_image)替换为下面两行

c 复制代码
find_library(NAME SDL2_image REQUIRED)
link_libraries(SDL2_image)

没完了 : 还有错误:

CMake Error at CMakeLists.txt:13 (add_executable): Target "main" links to item "-L/usr/lib/x86_64-linux-gnu -lSDL2 " which has leading or trailing whitespace. This is now an error according to policy CMP0004.

这是因为"-L/usr/lib/x86_64-linux-gnu -lSDL2 ",-lSDL2后面多了一个空格.

解决:修改CMakeLists.txt

在target_link_libraries之前,set(SDL2_LIBRARIES "-L${SDL2_LIBDIR} -lSDL2")

c 复制代码
set(SDL2_LIBRARIES "-L${SDL2_LIBDIR}  -lSDL2")

target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${Libdrm_LIBRARIES} m pthread)

继续编译:
make -j
又有问题 :
lv_sdl_window.c:413:5: error: unknown type name 'SDL_PixelFormatEnum'

修改文件lv_sdl_window.c:413左右.

我们不选了,直接用SDL_PIXELFORMAT_RGB888

c 复制代码
/*
#if LV_COLOR_DEPTH == 32
    SDL_PixelFormatEnum px_format =
        SDL_PIXELFORMAT_RGB888; //same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions
#elif LV_COLOR_DEPTH == 24
    SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_BGR24;
#elif LV_COLOR_DEPTH == 16
    SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565;
#else
#error("Unsupported color format")
#endif
    //    px_format = SDL_PIXELFORMAT_BGR24;
*/
    dsc->texture = SDL_CreateTexture(dsc->renderer, SDL_PIXELFORMAT_RGB888,
                                     SDL_TEXTUREACCESS_STATIC, disp->hor_res, disp->ver_res);
    SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND);
}

继续 make -j
又来问题 :
lv_sdl_window.c:(.text+0x272):对'SDL_SetWindowResizable'未定义的引用

通过查代码发现,lv_sdl_window_set_resizeable木有人调用,所以直接将这一行注释掉.

c 复制代码
void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value)
{
    lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
    //SDL_SetWindowResizable(dsc->window, value);
}

继续 make -j

我这里就成功了哈.

运行main

cd ../bin
./main

4 修改main.c

注释原来的demo,现在测试lv_demo_music.

其他例子:lv_demo_xxx也行.

//lv_demo_widgets();

//lv_demo_widgets_start_slideshow();

c 复制代码
int main(void)
{
    lv_init();

    /*Linux display device init*/
    lv_linux_disp_init();

    /*Create a Demo*/
    //lv_demo_widgets();
    //lv_demo_widgets_start_slideshow();
    lv_demo_music();//测试music
    /*Handle LVGL tasks*/
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }

    return 0;
}


问题 :

鼠标点击没反应.

解决:

在lv_port_linux\lvgl\src\drivers\sdl\lv_sdl_window.c

lv_sdl_window_create() 135行:添加lv_sdl_mouse_create();

ok:

相关推荐
女神下凡6 分钟前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道4 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
行者-全栈开发6 小时前
【鸿蒙心迹】国际化 i18n 与多语言资源管理实战(HarmonyOS 7.x)
ui·华为·重构·国际化·harmonyos·多语言
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落8 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨9 小时前
WSL2的安装与使用
linux·wsl
微小的鱼9 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng9 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频