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具体原因我没弄明白。

就写到这吧

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例

在群組中看到上述問題,研判應是一份隨月份變動的產品報價表單,空白欄可能表示該月份價格與上個月份一致。這個問題是需要取得最近一次單價和倒數第二次單價,常用且實務的excel案例值得紀錄。 最近一次單價: INDEX($B2:$G2,1,LARGE(IF(ISBLAN…

SpringSecurity集成JWT实现后端认证授权保姆级教程-环境搭建篇

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站…

跨平台开发教学:构建同时支持iOS和Android的教育网校APP

当下,教育行业也逐渐迎来了数字化转型的时代。构建一款支持iOS和Android的教育网校APP,不仅可以提供更好的用户体验,还能扩大应用的覆盖面,满足不同用户群体的需求。 一、选择合适的跨平台开发框架 在开始构建教育网校APP之前&a…

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型,它在前代模型的基础上进行了大幅度的改进,不仅在文本生成的连贯性、准确性上有了显著提升,还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…

构建异地企业网络互联的高效路径

在当今数字化浪潮中,企业的业务拓展已不再受限于地理位置。为了在全球竞争中立于不败之地,越来越多的企业选择在不同城市设立分支机构,构建异地网络,实现高效的协同办公。本文将深入探讨在北上广等经济发达地区,如何通…

Linux部署Yearning并结合内网穿透工具实现公网访问本地web管理界面

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

计算机毕业设计——SpringBoot 个人博客管理系统(附源码)

1,绪论 1.1 背景调研 在互联网飞速发展的今天,互联网已经成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。互联网上发布信息主要是通过网站来实现的,获取信息也是要在互联网中…

BART论文解读:BERT和GPT结合起来会发生什么?

BART:Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension 主要工作 提出了BART (Bidirectional and Auto-Regressive Transformers), 是一种用于自然语言生成、翻译和理解的序列到序列的预训练方法。它…

C语言编译器(C语言编程软件)完全攻略(第二十七部分:VS安全函数问题(C语言安全函数)是怎么回事?如何解决?)

介绍常用C语言编译器的安装、配置和使用。 二十七、VS安全函数问题(C语言安全函数)是怎么回事?如何解决? 在 VS(Visual Studio)下编译C语言程序,如果使用了 scanf()、gets()、strcpy()、strca…

【Windows】之微软输入法配置小鹤双拼

前言 Windows 自带的输入法微软输入法本身就是个最简洁、最方便的输入法,不需要去安装多余的第三方输入法软件。同时,微软中文拼音输入法支持双拼输入法,但微软自带的双拼输入法不包含小鹤双拼方案的。所以,在这里将会讲解如何配置…

oracle 补齐数字长度 to_char踩坑

oracle的to_char网上找到的说明如下 (1)用作日期转换: to_char(date,格式); select to_date(2005-01-01 ,yyyy-MM-dd) from dual; select to_char(sysdate,yyyy-MM-dd HH24:mi:ss) from dual; (2)处理数字&#xf…

深入理解Vue3中的自定义指令

Vue3是一个流行的前端框架,它引入了许多新特性和改进,其中之一是自定义指令。自定义指令是一种强大的功能,可以让开发者在模板中直接操作 DOM 元素。本文将深入探讨 Vue3中的自定义指令,包括自定义指令的基本用法、生命周期钩子函…

面试之线程状态

1.线程有哪些状态 1.1Java线程的六种状态 Java 线程六种状态 新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态 此时未与操作系统底层线程关联 可运行 调用了 start 方法,就会由新建进入可运行 此时与底层线程关联,由操作…

leetcode算法题之递归--综合练习(一)

此专题对我们之前所学的关于递归的内容进行一个整合,大家可以自行练习,提升自己的编码能力。 本章目录 1.找出所有子集的异或总和在求和2.全排列II3.电话号码的字母组合4.括号生成5.组合6.目标和7.组合总和8.字母大小写全排列9.优美的排列 1.找出所有子…

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

快速了解云计算与云原生

快速了解云计算与云原生 云计算云原生DevOps容器持续交付微服务 云计算 在讲云原生之前,先来讲讲云计算 其中云原生属于技术架构理念,而云计算提供应用所需的基础资源,云计算是云原生的基础,两者是相辅相成的 云计算简单来说&a…

嵌入式(四)定时器 | 定时器功能 分类 定时器工作模式 寄存器全介绍

文章目录 1 定时器工作原理2 定时器功能3 定时器分类3.1 定时器13.2 定时器23.3 定时器3和定时器43.4 睡眠定时器3.5 看门狗定时器 4 定时器工作模式4.1 自由运行模式4.2 模模式4.3 正计数/倒计数模式 5 定时器1寄存器5.1 计数寄存器5.2 计数控制寄存器 6 定时器的两种使用方式…

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址 https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程(如下 图所示&a…

【Linux基础】Linux主要指令的详解(指令补充)

1.cp指令(重要) 语法: cp [选项] 源文件或目录 目标文件或目录 功能: 复制文件或目录 说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说,w控制函数曲线的方向,b控制曲线水平方向位移,w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证,有限神经…