freetype矢量字体 —— 环境安装篇
思路
使用交叉编译器编译freetype库源码,将得到的头文件和库文件拷贝到交叉编译器所在目录,从而进行安装。
编译环境
- 交叉编译器:arm-linux-gnueabihf-gcc (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11))
- EVK(评估板)型号:100ASK_IMX6ULL_PRO
- SOC 型号:IMX6ULL
- 运行系统:Linux version 4.9.88
- freetype库版本:2.10.2
Linaro GCC编译器下载地址:
https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/arm-linux-gnueabihf/
由于我的PC是Win10x64,安装的系统Ubuntu 14都是64bit的,因此下载64bit版本;
32位系统版本:gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf.tar.xz
64位系统版本:gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz
安装freetype库所需安装包(建议版本):
freetype-2.10.2.tar.xz (官网:freetype page)
libpng-1.6.37.tar.xz (官网:libpng page)
zlib-1.2.11.tar.gz (官网:zlib page)
注:由于我的IMX6ULL EVK安装的工具链属于精简版("arm-linux-gnueabihf-"前缀),而非基于buildroot的比较完善的版本(arm-buildroot-linux-gnueabihf-前缀),因而没有安装zlib,需要手动安装。
为IMX6ULL交叉编译freetype
设置交叉编译器
为了对所有用户生效,修改PC上Linux的全局环境变量配置文件/etc/profile(也可以修改其他环境变量配置文件,对当前用户生效),在文件末尾添加以下内容:
# set Linux build tools path for IMX6
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bi
修改完成后,别忘了重新加载配置文件
$ source /etc/profile
测试、验证交叉编译器工具链arm-linux-gnueabihf-gcc,执行下面命令:
$ echo 'main(){}' | arm-linux-gnueabihf-gcc -E -v -
如果报错,说明没有配置成功或者没有使其生效。
如果成功,会看到工具链相关的目录以及版本信息。
可以从测试结果,确认交叉编译器默认搜索的的头文件的系统目录为:
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/include
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/include-fixed
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/include
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
通常,选最后一个作为用户自定义的头文件系统目录,也就是说,.h文件拷贝到该目录。
交叉编译器默认搜索的的库文件的系统目录:
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/lib/
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/lib/
/home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/
类似地,选最后一个作为用户自定义的库文件系统目录。也就是说,.a/.so文件拷贝到该目录。
交叉编译、安装zlib
freetype依赖于libpng,而libpng依赖于zlib,所以需要先编译、安装zlib。命令如下:
$ tar xzf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=$PWD/tmp
$ make
$ make install
$ cd tmp
# 将编译生成的头文件拷贝到工具链的头文件系统目录
$ cp include/* -rf /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
# 将编译生成的库文件拷贝到工具链的库文件系统目录
$ cp lib/* -rfd /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/
注:系统目录需要根据PC上编译器的实际目录,来决定。
交叉编译、安装libpng
命令如下:
$ tar xJf libpng-1.6.37.tar.xz # 注意不同格式压缩文件, 解压命令不一样
$ cd libpng-1.6.37
$ ./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp
$ make
$ make install
$ cd tmp
# 将编译生成的头文件拷贝到工具链的头文件系统目录
$ cp include/* -rf /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
# 将编译生成的库文件拷贝到工具链的库文件系统目录
$ cp lib/* -rfd /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/
注:--host指定交叉编译工具链前缀,如果不指定,默认使用系统自带的gcc编译器。
--prefix指定编译后生成的文件(头文件、库文件等)的安装目录,如果不指定,默认使用系统/usr/local/include和/usr/local/lib目录。
交叉编译、安装freetype
命令如下:
$ tar xJf freetype-2.10.2.tar.xz
$ cd freetype-2.10.2
$ ./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp
$ make
$ make install
$ cd tmp
# 将编译生成的头文件拷贝到工具链的头文件系统目录
$ cp include/* -rf /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
# 将编译生成的库文件拷贝到工具链的库文件系统目录
$ cp lib/* -rfd /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/
修改freetype头文件安装位置
编译出的freetype头文件,会安装到include/freetyp2/freetype目录下面,也就是说,如果要使用freetype库,C程序中需要这样包含头文件:
#include <freetype2/ft2build.h>
这跟所有的freetype例程是冲突的。因为例程是这样包含头文件的:
#include <ft2build.h>
为了方便测试和使用,我们将include/freetyp2/* 复制到上一级目录:
$ cd /home/martin/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include/
$ mv freetype2/* ./
测试、验证freetype库安装
测试、验证freetype库是否编译、安装OK,可以见 freetype矢量字体 —— 介绍篇 。
或者,直接编译用于显示字体的c程序:
完整源代码参见:freetype_show_font.c | gitee
小结
1)configure构建的项目
configure是autotools生成的项目构建脚本,特点是在项目根目录下存在一个configure文件。编译、安装开源软件的惯用方式:
$ ./configure
$ make
$ make install
configure的选项:
--host:指定编译程序的交叉编译器;
--prefix:指定安装目录;
可以使用下面命令,查看所有支持的选项。
$ ./configure --help
2)库链接
编译源码时,需要链接库文件,使用"-l"然后加上需要链接的库名称。如链接freetype,就要在编译指令后加上"-lfreetype"选项。