使用 fontconfig 支持为 Linux x86 构建 Qt

Posted

技术标签:

【中文标题】使用 fontconfig 支持为 Linux x86 构建 Qt【英文标题】:Building Qt for Linux x86 with fontconfig support 【发布时间】:2018-12-12 14:30:05 【问题描述】:

我正在将我的 Qt 应用程序移植到 Linux for x86 架构,并且由于该平台的最后一个正式版本是 5.5,我正在尝试构建自己的 Qt 5.11.3。我想使用 fontconfig 来启用系统字体。我的构建平台是 Centos 7.5,我使用的是 GCC 工具链,它使用 -m32 开关构建 x86 二进制文件。 问题是,我看不到 fontconfig 库。我已经用包 fontconfig-devel-2.13.0-4.3.el7.i686 安装了它

使用 -fontconfig 选项运行配置时,我收到以下错误消息:

错误:功能 'fontconfig' 已启用,但前提条件 '!config.win32 && features.system-freetype && libs.fontconfig' 失败。

我的理解是我必须使用 -system-freetype 并且不能使用 -qt-freetype,但是当我尝试使用时(也使用 -feature-freetype),我收到以下消息:

错误:功能“system-freetype”已启用,但前提条件“features.freetype && libs.freetype”失败。

config.log 中的相关消息是:

looking for library freetype
Trying source 0 (type pkgConfig) of library freetype ...
pkg-config use disabled globally.
  => source produced no result.
Trying source 1 (type freetype) of library freetype ...
+ cd /home/myuser/qt-build/config.tests/freetype && /home/myuser/qt-build/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += shared warn_off console single_arch" -early "CONFIG += cross_compile" 'LIBS += -lfreetype' /home/myuser/qt-build/config.tests/freetype
+ cd /home/myuser/qt-build/config.tests/freetype && MAKEFLAGS= /usr/bin/gmake
> g++ -c -m32 -pipe -O2 -std=gnu++11 -w -fPIC  -I. -I/home/myuser/qt-everywhere-src-5.11.3/qtbase/mkspecs/linux-g++-32 -o main.o main.cpp
> main.cpp:2:22: fatal error: ft2build.h: No such file or directory
>  #include <ft2build.h>
>                       ^
> compilation terminated.
> gmake: *** [main.o] Error 1
 => source failed verification.
test config.qtbase_gui.libraries.freetype FAILED

现在,我也收到了这条消息:

警告:没有 sysroot 的交叉编译。禁用 pkg-config

据我了解,这是“源 0”故障的根源。但是,我尝试通过将 FREETYPE_INCDIR=/usr/include/freetype2 传递给 configure 来手动将其指向 freetype 包含目录;但是,从日志文件中可以看出,在检测 freetype 时似乎没有使用该值。

我在这里错过了一个技巧,还是配置脚本被破坏了?如果是后者,有没有办法解决这个问题?

编辑:为了完整起见,运行配置的环境:

CFLAGS=-m32
CXXFLAGS=-m32 --std=c++1x

配置标志:

-opensource
-xplatform linux-g++-32
-nomake tests -nomake examples -nomake tools
-prefix /home/myuser/qt_install/
-qpa xcb
-no-use-gold-linker
-icu ICU_PREFIX=/home/myuser/icu_install ICU_LIBS="-licui18n -licuuc -licudata"
-no-opengl
-fontconfig -feature-freetype -system-freetype FREETYPE_INCDIR=/usr/include/freetype2

【问题讨论】:

你能编译和链接一个最小的 C 程序(带有 -m32)链接到 freetype 吗?你能分享你调用配置脚本的参数吗?请注意,从 x86_64 主机编译 x86 是交叉编译,这样做需要与本机构建不同的配置参数(这可能是禁用 pkg-config 的原因)。 如果我提供 -I/usr/include/freetype2 开关,我可以构建和链接一个链接到 freetype 的最小 C 程序,以便它可以找到 ft2build 标头 - 在 Qt 配置的上下文中我希望通过 FREETYPE_INCDIR=/usr/include/freetype2 来实现 - 但它似乎不像日志摘录中所证明的那样工作。 【参考方案1】:

我发现可以通过设置 CPATH(和 LIBRARY_PATH 指向一个特定的 Freetype 构建,结果证明我也需要它)来解决这个问题。看起来,在检测到 Freetype 的存在时忽略 FREETYPE_* 变量确实是配置脚本中的一个错误。

【讨论】:

【参考方案2】:

尝试使用 Qt 源代码中包含的 Freetype 库:运行 configure 时使用标志“-qt-freetype

【讨论】:

正如我原来的帖子中提到的,这似乎阻止了我使用 fontconfig:

以上是关于使用 fontconfig 支持为 Linux x86 构建 Qt的主要内容,如果未能解决你的问题,请参考以下文章

如何在 fontconfig 中设置每个 Unicode 范围/代码点的字体?

关于Linux fontconfig 字体库的坑

ini 通过fontconfig为表格图形打开Fira Sans的OpenType功能,使其成为更好的UI字体。适合Pop!_OS。

修复 Fontconfig Error

ArchLinux问题汇总

centos8平台:用fontconfig安装及管理字体(fc-list/fc-match/fc-cache)