t113-c-lcd_lvgl篇

recodemo / 2023-08-07 / 原文

之所以用lvgl,是因为lvgl实在是太轻便了,只用库就能够做处图形管理页面,非常方便。当然,主要是我不想再下载qtcreate了,虽然qt被运用的很广泛,但是目前我对lvgl的掌握程度还是更深一点

1.从github下载

https://github.com/lvgl/lvgl

2.为下载的lvgl源码创建例程

需要注意的是lvgl所使用的不是makefile而是cmake,所以要用cmakelist

3.编写cmakelists

先来看一下lvgl里面的cmakelists

再.cmake中有:

# Option to define LV_LVGL_H_INCLUDE_SIMPLE, default: ON
option(LV_LVGL_H_INCLUDE_SIMPLE
       "Use #include \"lvgl.h\" instead of #include \"../../lvgl.h\"" ON)

# Option to define LV_CONF_INCLUDE_SIMPLE, default: ON
option(LV_CONF_INCLUDE_SIMPLE
       "Simple include of \"lv_conf.h\" and \"lv_drv_conf.h\"" ON)

# Option to set LV_CONF_PATH, if set parent path LV_CONF_DIR is added to
# includes
option(LV_CONF_PATH "Path defined for lv_conf.h")
get_filename_component(LV_CONF_DIR ${LV_CONF_PATH} DIRECTORY)

# Option to build shared libraries (as opposed to static), default: OFF
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c)
file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c)
file(GLOB_RECURSE DEMO_SOURCES ${LVGL_ROOT_DIR}/demos/*.c)

if (BUILD_SHARED_LIBS)
  add_library(lvgl SHARED ${SOURCES})
else()
  add_library(lvgl STATIC ${SOURCES})
endif()

add_library(lvgl::lvgl ALIAS lvgl)
add_library(lvgl_examples STATIC ${EXAMPLE_SOURCES})
add_library(lvgl::examples ALIAS lvgl_examples)
add_library(lvgl_demos STATIC ${DEMO_SOURCES})
add_library(lvgl::demos ALIAS lvgl_demos)

target_compile_definitions(
  lvgl PUBLIC $<$<BOOL:${LV_LVGL_H_INCLUDE_SIMPLE}>:LV_LVGL_H_INCLUDE_SIMPLE>
              $<$<BOOL:${LV_CONF_INCLUDE_SIMPLE}>:LV_CONF_INCLUDE_SIMPLE>)

# Include root and optional parent path of LV_CONF_PATH
target_include_directories(lvgl SYSTEM PUBLIC ${LVGL_ROOT_DIR} ${LV_CONF_DIR})

# Include /examples folder
target_include_directories(lvgl_examples SYSTEM
                           PUBLIC ${LVGL_ROOT_DIR}/examples)
target_include_directories(lvgl_demos SYSTEM
                           PUBLIC ${LVGL_ROOT_DIR}/demos)

target_link_libraries(lvgl_examples PUBLIC lvgl)
target_link_libraries(lvgl_demos PUBLIC lvgl)

# Lbrary and headers can be installed to system using make install
file(GLOB LVGL_PUBLIC_HEADERS "${CMAKE_SOURCE_DIR}/lv_conf.h"
     "${CMAKE_SOURCE_DIR}/lvgl.h")

if("${LIB_INSTALL_DIR}" STREQUAL "")
  set(LIB_INSTALL_DIR "lib")
endif()
if("${INC_INSTALL_DIR}" STREQUAL "")
  set(INC_INSTALL_DIR "include/lvgl")
endif()

install(
  DIRECTORY "${CMAKE_SOURCE_DIR}/src"
  DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/"
  FILES_MATCHING
  PATTERN "*.h")

set_target_properties(
  lvgl
  PROPERTIES OUTPUT_NAME lvgl
             ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
             LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
             RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
             PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}")

install(
  TARGETS lvgl
  ARCHIVE DESTINATION "${LIB_INSTALL_DIR}"
  LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
  RUNTIME DESTINATION "${LIB_INSTALL_DIR}"
  PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}")

option

https://blog.csdn.net/lhl_blog/article/details/123553686

 根据上面这篇文章我们可以知道option的作用相当于定义,遵守以下几点

  • 1.第三格参数只要不是on都是off
  • 2.可以再cmake的时候修改定义的值,例如用-d....=ON or OFF
  • 3.子项目以父项目的定义为标准

get_filename_component

https://blog.csdn.net/wzj_110/article/details/116431616

寻找属性到var中:

很好理解

 add_library

https://blog.csdn.net/mataojie/article/details/121466125

https://blog.csdn.net/LaineGates/article/details/108242803

这个指令时cmake常用的指令,用来添加静态库和动态库的,或者时模块库参数如下

  • name 名字
  • STATIC|SHARED|MOUDLE:库的类型
  • EXCLUDE_FROM_ALL:加了EXCLUDE_FROM_ALL属性的target在默认编译的时候,不会被编译,如果要编译它们,需要手动编译
  • source:构建库的文件

例如:add_library(hello_library STATIC src/Hello.cpp )

以上是添加库,还有一种是添加已经生成的库:

说实话没看懂

还有一个常用的作用就是别名:

target_compile_definitions

https://blog.csdn.net/xiaodouhao123456/article/details/108391489?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-108391489-blog-128273937.235%5Ev38%5Epc_relevant_sort_base1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-108391489-blog-128273937.235%5Ev38%5Epc_relevant_sort_base1&utm_relevant_index=1

给目标添加定义?很奇怪什么东西,摸不着头脑,那定义如果是分对象的那么如何判断对象是否定义了某个宏呢?

这里的意思就i是判断这个宏是否定义了否则就给lvgl定义这个宏

后面大概懂了是再需要编译的目标中添加宏定义,并且traget必须不能是alias的重命名

target_include_directories

https://blog.csdn.net/sinat_31608641/article/details/121713191

该命令可以指定目标(exe或者so文件)需要包含的头文件路径。

对于public和接口等在下面文章中有讲解

https://zhuanlan.zhihu.com/p/82244559

在另外一篇文章中对头文件的包含也有更详细的解释:

https://juejin.cn/post/7127592962560622623

 

冒号的意思就是加单来说赋值给左边的变量

备注一下cmake常用的函数和宏定义:

https://blog.csdn.net/LaineGates/article/details/79190398