lvgl、freetype移植和编译(zlib、libpng)

一、LVGL在linux上的使用
 1、官网及源码获取:LVGL - Light and Versatile Embedded Graphics Library

    

  2、毫秒级定时实现 

    /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/

    //LVGL毫秒级定时实现,头文件 #include <sys/time.h> 在lv_conf.h里定义为 extern uint32_t custom_tick_get(void);找到#define LV_TICK_CUSTOM 定义为1
    uint32_t custom_tick_get(void)
    {
      struct timeval tv;
      gettimeofday(&tv, NULL);
      uint32_t time_ms = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
      return time_ms;
    }

  4、自定义字体(图标也可以)

    

    ,还需要在字体文件的目录下,把生成的.C字体文件添加到.mk里让它可以被编译

    如果是自定义图标,则要去下载图标的矢量图:https://www.iconfont.cn/help/index?spm=a313x.7781069.1998910419.31   

    a、在如上网址里将想要制作的图标添加到购物车

      

    b、点击购物车,里面有你选择好的所有图标,点击添加到项目,点击确定会进入如下界面,下载到本地,下载下来会有.TTF的文件,LVGL在线文字工具里上传这个.TTF图标矢量文件,Range里填入的范围要包含如下图标里所有范围即可。如下:        可填入:0xE571-0xE574,填0x20-0xFFFF也可以,包含即可,同上,转换后生成.C文件,使用时可参照LVGL本地的图标,使用中还需将如下Unicode值转为UTF-8,这里可以使用如下小工具(文件下)转好在代码里做宏定义。

          

二、LVGL添加jpg解码库(源码)
  
源码已添加到新版LVGL中,如果找不到下载路径,可到LVGL新版本里去复制。
  
三、LVGL添加PNG解码(源码)

  1、Github地址:
打开如下链接翻到如下界面下载PNG源码,此地址也可以从LVGL官网跳转过来
      
lvgl/lv_lib_png:用于LVGL的PNG解码器 (github.com)  
      
    新版中这些第三方库的源码实现方法都添加到LVGL源码中了,如果下的旧版,想要找这些源码,可以下一个新版,直接从这里复制源码,如下:。

      

  2、在lv_conf.h里添加宏定义:#define LV_PNG_USE_LV_FILESYSTEM  1
  3、main函数里包含头文件#include "lv_drivers/lv_lib_png-master/lv_png.h" ,并且初始化:lv_png_init()
  4、实现文件系统回调函数。

          

   5、但是发现还是不能显示,经过调试打印发现如下:

          


编译第三方库的万能命令(不行就在最前面加上交叉编译器的绝对路径CC=/PATH/..):
  ./configure --host=mips-linux-gnu --prefix=$PWD/tmp mips架构
  ./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp arm架构
四、zlib库移植和编译

  1、下载和编译源码:从官网(http://zlib.net/)下载源码后进入到该目录,我们查看makefile,根据这个Makefile,它首先会输出一条信息,告诉你应该先运行 ./configure 命令进行配置。它会根据你的系统环境生成适当的Makefile,此时我们可以先make编译一下看看是否正常,如果正常如下,也可使用./configure --help 查看帮助信息,里面会告诉我们是否使能动态和静态库以及怎样使能等:

    

  如果要运行于ARM开发板需使用ARM交叉编译器编译,如我的交叉编译器如下(这里没有指定编译器的绝对路径可以编译,最后标注的是库make完成以后sudo make install的安装目录-自定义-自己新建的):

   CC=mips-linux-gnu-gcc LD=mips-linux-gnu-ld AD=mips-linux-gnu-as ./configure --prefix=/home/kerson/gty_test_linux/my_lib/zlib(如此配置后会重新生成makefile,make即可编译)成功在该目录下生成.a .so文件等。

  也可以使用如下命令:

CC=/home/kerson/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc ./configure --prefix=$PWD/tmp

  如果提示如下错误,表示把警告当成了错误,我们打开configure,注释掉下面这几行代码即可:

    

  如果已经有交叉编译工具链还是提示找不到(make: mips-linux-gun-gcc: 没有那个文件或目录):可使用绝对路径:

  CC=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc LD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-ld AD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-as ./configure --prefix=/home/gty/practice/my_lib/zlib

 

          sudo make install安装后文件如图

  至此,zlib 库就已经编译好了,接下来我们需要把编译得到的库文件拷贝到开发板。
 
五、libpng库移植和编译
  1、下载和编译源码:从官网(http://www.libpng.org/pub/png/libpng.html)下载源码后进入到该目录,跟上面一样,也是配置、编译、安装。libpng 依赖于 zlib 库,前面我们 编译了zlib 库,但要告知编译器 zlib 库的安装目录,这样编译器才能找到 zlib 的库文件以及头文件,编译 libpng 的时才不会报错。 
    执行下面这三条命令,将 zlib 库安装目录下的 include 和 lib 路径导出到环境变量:
      export LDFLAGS="-L/home/dt/tools/zlib/lib"
      export CFLAGS=" -I/home/dt/tools/zlib/include"
      export CPPFLAGS="-I/home/dt/tools/zlib/include" 
    配置:CC=mips-linux-gnu-gcc ./configure --prefix=/home/kerson/gty_test_linux/my_lib/libpng-1.6.40/pnglib --host=mips-linux-gnu  (host:目标架构:表示使用mips架构并且是linux的gnu编译器)
    make编译时目录下没有生成.a  .so等文件,但是sudo make install时在安装目录lib下生成了.a文件,没有.so文件。
    通过./configure --help我们看到默认是编译共享库的,但确没有生成,加上LD =   AD=.....这样就可以生成.a和.so文件。   
    CC=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc LD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-ld AD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-as ./configure --host=mips-linux-gnu --prefix=/home/gty/practice/my_lib/pnglib --enable-shared --disable-stati (红色标记作为是否编译动态共享库或者静态库)
  也可以使用如下命令:
  CC=/home/kerson/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc ./configure --prefix=$PWD/tmp --host=mips-linux-gnu
    make时观察错误信息,如果是报错没有.so文件,或找不到某个库,我们加上如上LD,或所需要的环境变量,如果还是报错没有lzib库,可重新编译该库。

    

    

六、freetype库移植和编译

  1、下载和编译源码:从官网(https://www.freetype.org/   或  Index of /releases/freetype/ (gnu.org) )下载源码后进入到该目录,下载最新版本发现./configure不能配置,从新下载了旧版本。 

    由于该库依赖于zlib和libpng,源码目录freetype-2.12.1/include/freetype/config/ftoption.h下默认注释了这两个宏,我们把注释去掉。

    

     #define FT_CONFIG_OPTION_SYSTEM_ZLIB

     #define FT_CONFIG_OPTION_USE_PNG

    freetype库要依赖zlib库和libpng库,如果设置了zlib库的环境变量,那我们再设置libpng库的环境变量,上面我们编译libpng的库我们放到文件夹pnglib下,但是这一步发现编译就会报错,文件夹名字换成了png就好了。 

    export LDFLAGS="-L/home/gty/practice/my_lib/zlib/lib"
    export CFLAGS="-I/home/gty/practice/my_lib/zlib/include"
    export CPPFLAGS="-I/home/gty/practice/my_lib/zlib/include"

    export LDFLAGS="-L/home/gty/practice/my_lib/png/lib"
    export CFLAGS="-I/home/gty/practice/my_lib/png/include"
    export CPPFLAGS="-I/home/gty/practice/my_lib/png/include"

   注:上面是六条命令,下面是一条指令。

CC=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc LD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-ld AD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-as ./configure --prefix=/home/gty/practice/my_lib/freetype/ --host=mips-linux-gnu --with-zlib=yes --with-bzip2=no --with-png=yes --with-harfbuzz=no ZLIB_CFLAGS="-I/home/gty/practice/my_lib/zlib/include -L/home/gty/practice/my_lib/zlib/lib" ZLIB_LIBS=-lz LIBPNG_CFLAGS="-I/home/gty/practice/my_lib/png/include -L/home/gty/practice/my_lib/png/lib" LIBPNG_LIBS=-lpng

  或者用如下:

CC=/home/kerson/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc ./configure --prefix=$PWD/tmp --host=mips-linux-gnu ZLIB_CFLAGS="-I/home/kerson/gty_test_linux/my_lib/zlib/include -L/home/kerson/gty_test_linux/my_lib/zlib/lib" ZLIB_LIBS=-lz LIBPNG_CFLAGS="-I/home/kerson/gty_test_linux/my_lib/png/include -L/home/kerson/gty_test_linux/my_lib/png/lib" LIBPNG_LIBS=-lpng

    执行make 如果没报错再执行 sudo make install 生成如下文件: 

    

七、如何使用编译的库 ?

  1、对于代码工程来说,一般都有一个放置各种库的目录lib,我们将编译好的库放到该目录下,如下所示,因为freetype库依赖另外两个库,因此我们都要复制进来。

      

    此时我们将这三个库包含到makefile看能不能编译通过:

      

    如上,添加好后编译能通过我们还不能使用API,我们还需要将生成的 include 改个名字放到我们的工程头文件下,这样就可以包含库里的头文件去使用API了,由于我们改了头文件的名字,所以肯定会有报错,一般是头文件路径。到这里我们可以根据下面这个链接和正点原子linux C开发指南里的这部分内容来使用API了。

    freetype使用详解(中文) - 道客巴巴 (doc88.com)

  2、假设我们放到如下目录,需要设置一下环境变量,以便系统能够找到该库的位置:export LD_LIBRARY_PATH=/usr/data/lib:$LD_LIBRARY_PATH

  3、如何显示单个汉字,以及多个汉字?

    (38条消息) 【Linux】用LCD文字祝愿(Framebuffer+Freetype)_希希雾里的博客-CSDN博客     (只要头文件路径正确,注册了屏幕fb0驱动,完全使用博客里的代码可以正常显示--,也可以使用正点原子linux应用编程指南官方文档里的示例,注意如果在背景图片上显示时字体还是会有锯齿,如果不在背景图片上显示则可以用阴影的方式实现抗锯齿效果,要想真正实现抗锯齿,可以使用 LVGL+Freetype的方法)。

  4、如果要在LVGL中使用Freetype则需要配置lv_conf.h

    

  5、虽然库已经添加进来了,但是我们不知道要执行哪些步骤,可以再在Github上下载这个解析源码,一般是一个.C和.h文件,包含以后可以直接使用LVGL官网提供的示例,新版里已经集成了这个源码,不用再重新下载添加。

  

  

  

 

 

  

 

posted @ 2023-07-16 12:51  耿通宇  阅读(2543)  评论(1编辑  收藏  举报