FreeType 是一个操作字体的函数库,它不但可以处理点阵字体,也可以处理多种矢量字体,包括 TrueType 字体,为上层应用程序提供了一个统一的调用接口。FreeType 具有良好的可移植性,特别考虑了嵌入式应用环境,字体文件可以在文件系统中,也可以在 ROM 中,甚至可以用自定义 IO 函数来访问字体数据。

Windows 版一般不提供静态编译,本教程主要介绍了在 Windows 如何静态编译 FreeType。在开始之前,首先确认你的机器已经安装了 CMake 和 Visual Studio,如果你不知道怎样安装,可以查看 CMake 安装教程Visual Studio 安装教程

首先去官网,下载 FreeType 的源码包。

freetype 官网

当前最新版本的 FreeType 为 2.10.1。载完成后,解压,找到 CMakeLists.txt 文件,用已经安装好的 CMake 软件打开,或者直接将该文件拖拽到 CMake 的 UI 界面上。在 Where to build the binaries 目录后面增加 _build 目录。这样可以确保生成的文件在 _build 目录中,而不会污染原有的 freetype 目录。

cmake gui

点击 Configure 按钮,生成配置信息,如果弹出新建 _build 目录确认的对话框,选择 Yes。

提示

选择你想要编译的平台版本,这里使用 vs2019 编译 x64 位的静态库。

平台选择

点击 Finish,CMake 会自动识别当前系统的配置信息,并生成相关的配置文件。

Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.18363.
The C compiler identification is MSVC 19.24.28315.0
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) 
Could NOT find harfbuzz (missing: HARFBUZZ_INCLUDE_DIRS HARFBUZZ_LIBRARIES) 
Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) 
Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) 
Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) 
Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) 
Configuring done

编译选项

FreeType 默认可以根据当前的环境选择配置,如果你需要支持额外的特性,例如 bzip2 压缩字体、png 位图字体等功能,就需要勾选对应的复选框,并添加这些库的路径。这里我勾选了 FT_WITH_ZLIB 选项:

添加 zlib

再次点击 Configure 按钮重新生成配置。如果一切正常,点击 Generate 生成解决方案,最后点击 Open Project 打开工程文件。

解决方案

解决方案中的 freetype 工程可以编译静态库。按照 Debug/Release 和 /MT 以及 /MD 之分,至少可以组合四种配置,所以我们分别选择不同的配置属性,生成最后的四种库文件,并将它们放到不同的目录下。具体的配置方法可以查看 运行时库详解 这篇文章,每次修改配置都编译一次工程,编译成功后,将生成的结果放到一开始设定的目录下,最后的目录结构如下:

---
 |--- include //放头文件
 |--- lib
       |--- Debug
       |      |--- MDd
       |      |     |-- freetyped.lib
       |      |
       |      |--- MTd
       |            |-- freetyped.lib
       |
       |--- Release
              |--- MD
              |     |-- freetype.lib
              |
              |--- MT
                    |-- freetype.lib

为了方便这里我打包了最后的结果,方便大家直接使用,不过这里只有 x64 版本,如果你的机器还是 32 位系统则无法使用。

这里有一点需要注意,在 include 头文件的目录里面需要加入 CMake 生成的 ftconfig.h 和 ftoption.h 文件,这个文件默认生成在 _build/include 里面,如果忘记这些头文件,在使用 freetype 库的时候,可能会无法找到 ftconfig.h 和 ftoption.h 而导致编译无法通过。