软件适配,需要qt最小版本是5.9.9,但是鲲鹏机器上qt最大版本是5.6.1,需要在鲲鹏机器上使用源码编译安装5.9.9
鲲鹏机器信息
arch=arm64
milestone=V10-Release-Build1-20200710
问题
在编译webengine模块时,系统中安装了已经安装了fontconfig,但是就是找不到,各种方法都尝试了,仍无法解决,决定从qt源码来看看究竟有什么猫腻。
定位问题报错处
编译webengine时,报错Unmet dependency: fontconfig
,找到改报错出处,在文件.\qtwebengine\mkspecs\features\configure.prf
中74行,找到了相关上下文,内容如下:
...
REQUIRED_PACKAGES = dbus-1 fontconfig
!contains(WEBENGINE_CONFIG, embedded_build): qtConfig(xcb): REQUIRED_PACKAGES += libdrm xcomposite xcursor xi xrandr xtst
qtConfig(pulseaudio): REQUIRED_PACKAGES += libpulse
qtConfig(system-png): REQUIRED_PACKAGES += libpng
qtConfig(system-harfbuzz) {
packagesExist("\'harfbuzz >= 1.2.0\'"): WEBENGINE_CONFIG += use_system_harfbuzz
else: log("System harfbuzz is too old (min. version 1.2). Using Chromium's copy.$${EOL}")
}
qtConfig(glib) {
packagesExist("\'glib-2.0 >= 2.32.0\'"): WEBENGINE_CONFIG += use_glib
}
for(package, $$list($$REQUIRED_PACKAGES)) {
!packagesExist($$package):skipBuild("Unmet dependency: $$package")
}
...
可以看到,判断包是否存在是packagesExist
函数,下面来看packagesExist
函数是如何实现的
packagesExist实现
在.\qtbase\mkspecs\features\qt_functions.prf
文件中实现如下:
defineTest(packagesExist) {
# this can't be done in global scope here because qt_functions is loaded
# before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
# yet. oops.
pkg_config = $$pkgConfigExecutable()
for(package, ARGS) {
!system($$pkg_config --exists $$package):return(false)
}
return(true)
}
defineTest
是qmake的内建函数,其介绍可以参考qmake language 内建函数 内置函数 自定义函数 defineTest(testfunctionname) defineReplace(repacefunctionname)
通过packagesExist
的定义可以看到,检查软件包使用pkg-config
的--exists
来实现,所以,我们在系统外的命令行中使用该命令来查看一下是否能找到fontconfig
软件包。
执行:
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# pkg-config --exists dbus-1
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# echo $?
0
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# pkg-config --exists fontconfig
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# echo $?
1
在鲲鹏系统上,可以看到pkg-config --exists fontconfig
返回值为1,表示执行失败,也就是fontconfig没有正确找到,我在其他系统上执行该命令,返回值为0。
system
函数的使用参考C中SYSTEM()的返回值 ,C system()的返回值
摘自上面参考文件内容:
比如如果system执行grep但是没抓住字符,它的返回值就是256,WEXITSTATUS(rc)就是1
system()返回您启动的进程的退出代码。
退出代码通常仅具有以下约定:退出代码0表示成功而非零表示失败。
探索到pkg-config --exists fontconfig
执行失败原因
查询pkg-config的使用方法参考pkg-config命令使用,使用pkg-config --exists --print-errors fontconfig
查看报错信息,报错信息提示:
package 'fontconfig',required by 'world',not found
显示改提示原因是没有安装fontconfig的开发库,所以去查看系统中库的安装情况,显示libfontconfig1-dev库没有安装,遂安装,安装之后再执行pkg-config --exists --print-errors fontconfig
,没有报错信息。
诡异
使用pkg-config --exists fontconfig
也查看了,系统中确实安装了这个库,但是就是qt找不到,怎么办?
终极方法,在终端显示的指定PKG_CONFIG_PATH,如下:
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/aarch64-linux-gnu/pkgconfig
这个时候在去查看,qt就能够找到了那个找不到的fontconfig了。