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: /libpng−1.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具体原因我没弄明白。
就写到这吧