im6ull学习总结(三-3)freetype

1、Freetype简介

FreeType是一个开源的字体渲染引擎,主要用于将字体文件转换为位图或矢量图形,并在屏幕上渲染出高质量的字体。它提供了一组API,使开发者能够在自己的应用程序中使用和呈现字体。
FreeType最初是作为一个独立项目开发的,后来成为许多其他开源软件的重要组成部分,例如GNU Image Manipulation Program(GIMP)、Ghostscript、LibreOffice等。它也被广泛应用于操作系统中,用于在屏幕上显示和打印文本。
FreeType支持多种字体格式,包括TrueType(TTF)、OpenType(OTF)、PostScript(PS)、以及其他一些常见的字体格式。它具有强大的字体轮廓解析和渲染功能,可以处理各种字体效果,如抗锯齿、子像素渲染等。它还支持字体缓存管理、跨平台适配等功能,使得字体的渲染和显示更加高效和灵活。
通过使用FreeType,开发者可以轻松地在自己的应用程序中实现高质量的字体渲染,无论是在计算机、移动设备还是嵌入式系统中。它对于构建图形用户界面(GUI)、排版系统、图像处理软件等具有重要的作用。
总结起来,FreeType是一个功能强大的开源字体渲染引擎,为应用程序提供了丰富的字体处理和渲染功能,使得字体在屏幕上呈现更加清晰和准确。

2、交叉编译freetype

echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
在这里插入图片描述
库文件的系统目录为:
LIBRARY_PATH=/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/lib/:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/
在这里插入图片描述
我们编译的目的是什么呢
这里先引入一些编译的知识

头文件和库文件

头文件(Header File)通常包含一些函数、变量、结构体等声明,用于将这些声明导入到当前源文件中,以便在当前源文件中使用这些声明。头文件通常以.h为扩展名,并通过#include预处理指令将其包含到源文件中。

库文件(Library File)则是已经编译好的二进制代码,包含了一些函数、变量、结构体等定义,并提供了对它们的访问接口。库文件通常以.lib(Windows)或.a(Linux)为扩展名,并通过链接器将其与当前源文件进行链接,以便在运行时使用这些函数和变量。

头文件和库文件通常都是由第三方库提供的,可以通过官方网站下载或者在操作系统上进行安装。在使用一个库时,需要将其头文件包含到源文件中,并将其库文件链接到当前可执行程序中,以便在运行时使用其中的函数和变量。
也就是说头文件是我们编译时需要导入到源文件(.c)的(.h)文件用于编译。而库文件是编译好的二进制文件链接器将他们链接起来生成可执行文件

编译是将高级语言代码翻译成机器语言代码的过程,通常分为四个流程:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
复习一下编译过程:
预处理(Preprocessing):预处理器将源代码中以“#”开头的预处理指令进行处理,如#include、#define等,将它们转换为实际的代码,并生成一个新的扩展名为“.i”的文件。这个过程主要是为了方便代码重用和管理,以及提高编译效率。

编译(Compilation):编译器将预处理后的代码(即.i文件)翻译成汇编语言代码(即.s文件),并检查代码中的语法错误。编译器将高级语言代码转换成汇编语言代码的过程中,包括了词法分析、语法分析、语义分析、优化等过程。

汇编(Assembly):汇编器将汇编语言代码(即.s文件)翻译成机器语言代码(即.o文件)。汇编器将高级语言代码转换成机器语言代码的过程中,主要是将汇编语言代码中的指令、寄存器、内存地址等转换成相应的二进制码。

链接(Linking):链接器将目标文件(即.o文件)和库文件(如果有的话)链接成一个可执行文件(即.exe文件或.out文件)。链接器将目标文件和库文件中的代码、数据等内容合并起来,生成一个独立可执行的文件,它包含了程序的完整功能。
c/h->i->s->o->(o+a)->.out/.exe

我们想用一个开源库就会用到开源库里面的头文件和库文件,那么如何找到我们编译的开源库的头文件和库文件,就需要我们将库的头文件和库文件放到指定的编译工具链中,这样编译时就会找到了
也就是说我们要进行一下两个步骤
1、如果你编译的是一个库,请把得到的头文件、库文件放入工具链的 include、lib 目录里。别的程序要使用这些头文件、库时,会很方便。
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v –
它会列出头文件目录、库目录(LIBRARY_PATH)。
2、把库文件放到板子上的/lib 或/usr/lib 目录里
程序在板子上运行时,需要用到板子上/lib 或/usr/lib 下的库文件;程序运行时不需要头文件。

交叉编译freetype的过程

freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译安装 zlib,再编译安装 libpng,最后编译安装 freetype。
第1步 确定头文件、库文件在工具链中的目录

先设置交叉编译工具链:
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-

export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

这里注意这只是将当前shell中的环境变量更换了,并不会将.bashrc中的环境变量进行变换。所以当我们更换一个终端后就失效了,想要永久生效,就是修改.bashrc中的文件。

我们可以通过echo $环境变量名来查看当前shell下环境变量的值
比如
在这里插入图片描述
但是.bashrc中的值还是arm

以 IMX6ULL 开 发 板 为 例 , 它 的 工 具 链 是 arm-buildroot-linux-gnueabihf-gcc,可以执行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
这个命令是用来测试交叉编译器的预处理功能。具体来说它通过管道将字符串 ‘main(){}’ 传递给 arm-buildroot-linux-gnueabihf-gcc 编译器,并要求其执行预处理操作。
-E 选项告诉编译器只执行预处理操作并将结果输出到标准输出。-v 选项用于显示编译器的版本和配置信息。最后的短横线 - 表示从标准输入读入数据。

执行该命令后,arm-buildroot-linux-gnueabihf-gcc 将对输入的代码进行预处理,并输出预处理后的代码到标准输出。同时还会显示编译器的版本和配置信息。

需要注意的是,由于这是一个测试命令,它不会生成可执行文件或目标文件,而是用来验证编译器是否能够正确地执行预处理操作。

可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
库文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/
bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib

第2步 交叉编译、安装 libpng
freetype 依赖于 libpng,所以需要先编译、安装 libpng
将libpng-1.6.37.tar.xz拷贝到./当前目录下
tar xJf libpng-1.6.37.tar.xz

这个命令是用来解压缩 libpng-1.6.37.tar.xz 压缩包的。

tar 是一个常用的归档工具,可以将多个文件和目录打包成单个文件,并在需要的时候进行解包。xJf 参数告诉 tar 解包并解压缩一个 xz 压缩过的 tarball 文件。

具体来说,x 选项表示解包,J 表示使用 xz 压缩格式,f 表示从文件中提取数据,并且后面必须跟随要解包的文件名。因此,tar xJf libpng-1.6.37.tar.xz 命令会将当前目录下的 libpng-1.6.37.tar.xz 文件解压缩到当前目录,并创建一个名为 libpng-1.6.37 的目录,其中包含所有的文件和子目录。
注意这是个小写x大写J小写f

这个命令是用来配置软件包以在 arm-buildroot-linux-gnueabihf 主机上进行交叉编译,并指定一个临时目录。

./configure --host= arm-buildroot-linux-gnueabihf --pre
fix=$PWD/tmp
./configure 是一个常见的脚本,用于自动检测系统环境并生成适合当前系统的编译选项。通过运行这个脚本,您可以为软件包指定一些选项,例如安装路径、编译器、依赖项等。

–host=arm-buildroot-linux-gnueabihf 参数告诉 configure 脚本,我们希望将软件包配置为在 arm-buildroot-linux-gnueabihf 主机上进行交叉编译。这是因为该主机使用的是 ARM 架构,与当前系统架构不同。

–prefix=$PWD/tmp 参数设置安装路径为当前工作目录下的 tmp 目录。通常,这个临时目录用于存放交叉编译后的二进制文件和库文件,而不会对系统产生影响。

注意, P W D 表示当前工作目录的路径。然后执行 b o o k @ 100 a s k :   / l i b p n g − 1.6.37 PWD 表示当前工作目录的路径。 然后执行 book@100ask:~/libpng-1.6.37 PWD表示当前工作目录的路径。然后执行book@100ask: /libpng1.6.37 make
book@100ask:~/libpng-1.6.37$ make install
运行配置文件时不会生成tmp文件
需要make 和 make install 后自动生成

然后复制文件
cp include/* -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include

cp lib/* -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib/

引入知识点
/…/

在 Linux 和 Unix 系统中,/…/ 是一个特殊的路径符号,表示返回到上一级目录。这个符号用于简化路径,在指定路径时可以去掉它。

例如,假设当前工作目录为 /home/user/Documents,那么路径 /home/user/Documents/…/Downloads 可以简化为 /home/user/Downloads,因为 /…/ 表示返回到上一级目录 /home/user。

需要注意的是,如果一个路径中包含多个 /…/,则它们可以被合并成一个,例如:

/home/user/Documents/…/…/Downloads 可以简化为 /home/Downloads。
/home/user/Documents/…/Downloads/…/Pictures 可以简化为 /home/user/Pictures。
在编写脚本或命令时,正确使用路径符号可以让代码更加简洁和可读,也可以避免一些路径相关的错误。

cp

cp -rfd 是 cp 命令的另一种参数组合,用于复制文件或目录,并在复制过程中进行一些操作。具体含义如下:

-r 选项表示递归地复制目录及其内容。
-f 选项表示强制复制,即在目标位置已有同名文件或目录时,不提示用户而是直接覆盖。
-d 选项表示复制时保留符号链接,而不是解引用它们。
因此,cp -rfd 命令通常用于递归地复制目录及其内容,并且在复制过程中保留符号链接。同时,它也会在目标位置已存在同名文件或目录时进行覆盖。这种参数组合可以在需要复制目录结构并保留符号链接的情况下使用。

当使用 cp 命令复制文件或目录时,如果原始文件或目录中包含符号链接(软链接),默认情况下 cp 命令会解引用这些符号链接,并复制它们所指向的实际文件或目录。但是使用 -d 选项后,cp 命令会保留这些符号链接,而不是解引用它们。

举个例子,假设有一个名为 source 的目录,其中包含一个名为 file1 的普通文件和一个名为 link1 的符号链接,指向 file1。现在我们使用 cp -rd source destination 命令将 source 目录复制到 destination 目录:

bash
$ ls -l source
-rw-r–r-- 1 user user 10 Jan 3 15:00 file1
lrwxrwxrwx 1 user user 5 Jan 3 15:01 link1 -> file1
默认情况下,如果我们运行 cp -r source destination,那么 destination 目录中的 link1 将会变成一个指向 file1 的新文件,而不再是一个符号链接。但是如果我们运行 cp -rd source destination,那么 destination 目录中的 link1 将保持为一个符号链接,仍然指向 file1。

这样做的好处是,在目标位置保留符号链接可以使得目标位置的目录结构保持原样,符号链接仍然指向正确的文件或目录,而不会被解引用导致指向错误的位置。

编译freetype

freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译安装 zlib,再编译安装 libpng,最后编译安装 freetype。但是,有些工具链里有 zlib, 那就不用编译安装 zlib,比如 STM32MP157。本节文档以 IMX6ULL 开发板中 arm-buildroot-linux-gnueabihf-gcc 工具链为例,对于其他开发板:工具链可能不一样,请灵活变通。

第一步设置交叉编译工具链

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-

export PATH=$PATH:/home/book/100ask_imx6ullsdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

以 IMX6ULL 开 发 板 为 例 , 它 的 工 具 链 是 arm-buildroot-linux-gnueabihf-gcc,可以执行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以确定头文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
库文件的系统目录为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/…/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/…/…/…/…/arm-buildroot-linux-gnueabihf/lib
第二步编译libpgn
但是注意这个存在问题我在这搞了一天还是官方帮搞定的
逻辑是这样的先编译freetype

./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp

在这里插入图片描述
这里已经包含bzip2和libpng了那就不要按照原有手册上编译libpng了,编译了反而出错。导致lib里面的文件为x86-64具体原因我没弄明白。

就写到这吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

欢乐钓鱼^^

欢迎来到程序小院 欢乐钓鱼 玩法&#xff1a;点击鼠标左键左右晃动的鱼钩&#xff0c;下方左右移动的鱼对准鱼的方向即可进行钓鱼&#xff0c; 不同的鱼不同的分数&#xff0c;快去钓鱼吧^^开始游戏https://www.ormcc.com/play/gameStart/241 html <div id"gamediv&qu…

(leetcode)替换所有的问号 -- 模拟算法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09; 输入描述 string modifyString(string s) 输入一个字符串&#xff0c;字符串中仅包含小写字母和 ‘?’ 字符。 输出描述 将问号替换为小写字母&#xff0c;且这个替…

数据结构期末复习

章节知识点分析 第一章绪论 基本概念 数据 数据元素&#xff08;记录、表目&#xff0c;是数据集合中一个个体&#xff09; 数据项&#xff1a;一个数据元素可由若干数据项组成 数据对象&#xff1a;性质相同的数据元素的集合&#xff0c;是数据的一个子集 数据结构&…

LLM漫谈(二)| QAnything支持任意格式文件或数据库的本地知识库问答系统

一、QAnything介绍 QAnything (Question and Answer based on Anything) 是致力于支持任意格式文件或数据库的本地知识库问答系统&#xff0c;可断网安装使用。 您的任何格式的本地文件都可以往里扔&#xff0c;即可获得准确、快速、靠谱的问答体验。 目前已支持格式: PDF&…

MiniCom串口调试工具使用

一、程序安装 执行下面代码&#xff0c;安装minicom。 sudo apt-get install minicom 二、查看串口设备名称 先拔掉串口运行下面指令&#xff0c;获得所有设备名称,插上串口再运行一次&#xff0c;新增的就是串口设备名称&#xff0c;记住串口设备名称&#xff0c;以串口设备名…

LeetCode-整数反转(7)

题目描述&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231&#xff0c;231− 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff0…

[4K80 AI ISP IPC芯片]

4K80 AI ISP IPC芯片 Hi3403V100是一颗面向监控市场推出的专业 Ultra-HD Smart IP Camera SOC&#xff0c;该芯片最高支持四路sensor输入&#xff0c;支持最高4K60的ISP图像处理能力&#xff0c;支持3F WDR加粗样式、多级降噪、六轴防抖、硬件拼接等多种图像增强和处理算法&am…

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 身先才能率人&#xff0c;律己才能服人…

【SpringBoot】公共字段自动填充功能实现(枚举、自定义注解、AOP、反射)

1. 自定义注解 使用interface语法来定义注解&#xff08;Annotation&#xff09;。 注解的参数类似无参数方法&#xff0c;可以用default设定一个默认值&#xff0c;比如String value() default "";。 元注解&#xff1a;有一些注解可以修饰其他注解&#xff0c;这…

基础面试题整理2

1.抽象类与接口区别 语法&#xff1a; 抽象类用abstract定义&#xff1b;接口用interface定义抽象类被子类继承extends&#xff08;不可用final修饰&#xff09;&#xff1b;接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰&#xff1b;接口中的方法只能…

【STM32】STM32学习笔记-DMA数据转运+AD多通道(24)

00. 目录 文章目录 00. 目录01. DMA简介02. DMA相关API2.1 DMA_Init2.2 DMA_InitTypeDef2.3 DMA_Cmd2.4 DMA_SetCurrDataCounter2.5 DMA_GetFlagStatus2.6 DMA_ClearFlag 03. DMA数据单通道接线图04. DMA数据单通道示例05. DMA数据多通道接线图06. DMA数据多通道示例一07. DMA数…

计算机网络(2)

计算机网络&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;2&#xff09;分组交换网中的时延、丢包和吞吐量时延丢包吞吐量总结 协议层次及其服务模型模型类型OSI模型分析TCP/IP模型分析 追溯历史 小程一言 我…

数据结构——堆排序

什么是堆排序 堆排序就是利用堆&#xff08;假设利用大堆&#xff09;进行排序的算法。他的基本思想是&#xff0c;将待排序的序列构造成一个大顶堆。此时&#xff0c;整个序列的最大值就是堆顶的根节点。将他移走&#xff08;其实就是将其与堆数组的末尾元素交换&#xff0c;…

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型&#xff0c;它的影响力也远远超出了专业技术范畴&#xff0c; 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域&#xff0c;并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

Java快速排序希尔排序归并排序

快速排序算法 快速排序的原理&#xff1a;选择一个关键值作为基准值。比基准值小的都在左边序列&#xff08;一般是无序的&#xff09;&#xff0c;比基准值大的都在右边&#xff08;一般是无序的&#xff09;。一般选择序列的第一个元素。 一次循环&#xff1a;从后往前比较&…

VMware中删除虚拟机

虚拟机使用完成后&#xff0c;需要删除虚拟机如何操作呢&#xff1f; 1.首先进入VMware 2.选择需要删除的虚拟机&#xff0c;点击右键 3.直接选择“移除”&#xff1f; 当然不是&#xff0c;这只是从这么目录显示中去掉了&#xff0c;并非 “真正” 删除该虚拟机 注意&#x…

使用sentinel作为熔断器

什么是sentinel Sentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的“雪崩”效应&#xff0c;为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维…

labelme的json转mask,实测有效

1、创建一个conda的虚拟环境 conda creat -n labelme python3.82、转到你的标注文件夹&#xff08;包括json和图片&#xff09; cd C:/Users/Administrator/Desktop/json3、你需要在标注文件夹下用txt写下以下代码&#xff0c;并保存bat文件。 放在最后一个就可以了 echo of…

Python的核心知识点整理大全66(已完结撒花)

目录 D.3 忽略文件 .gitignore 注意 D.4 初始化仓库 D.5 检查状态 D.6 将文件加入到仓库中 D.7 执行提交 D.8 查看提交历史 D.9 第二次提交 hello_world.py D.10 撤销修改 hello_world.py 注意 D.11 检出以前的提交 往期快速传送门&#x1f446;&#xff08;在文…

微服务实战系列之Filter

前言 Filter&#xff0c;又名过滤器&#xff0c;当然不是我们日常中见到的&#xff0c;诸如此类构件&#xff1a; 而应该是微服务中常使用的&#xff0c;诸如此类&#xff08;图片来自官网&#xff0c;点击可查看原图&#xff09;&#xff1a; 一般用于字符编码转换&#xf…