在Yocto中构建含子项目的Qt项目时出现‘Unknown module(s)’错误
问题描述
为qt-labs的qthttpserver(5.15分支)编写Yocto配方qthttpserver_5.15.bb,配方内容如下:
SUMMARY = "qthttpserver recipe" DEPENDS = "qtbase qtwebsockets" LICENSE = "GPL-3.0-only" LIC_FILES_CHKSUM = "file://LICENSE.GPL3;md5=d32239bcb673463ab874e80d47fae504" SRC_URI = "gitsm://github.com/qt-labs/qthttpserver.git;protocol=https;branch=5.15" SRCREV = "52bce52413763ead7759f8c2e374a40bb82f058f" S = "${WORKDIR}/git" inherit qmake5 do_install() { install -d ${libdir} cp ${S}/lib/* ${libdir}/ } FILES:${PN} += " \ ${libdir}/* \ "
构建过程中遇到以下问题:
- Yocto自动构建时抛出错误:
Project ERROR: Unknown module(s) in QT: sslserver,推测是sslserver子项目未被优先构建 - 在构建目录下使用Yocto提供的qmake手动执行:
出现错误:../recipe-sysroot-native/usr/bin/qmake ../git/qthttpserver.pro -spec linux-g++ ../recipe-sysroot-native/usr/bin/make -f Makefile qmake_allProject ERROR: Unknown module(s) in QT: gui,但项目代码中并未引用gui模块 - 使用本地系统安装的Qt 5.15.2的qmake手动执行:
构建完全正常"/opt/Qt/5.15.2/gcc_64/bin/qmake" ../git/qthttpserver.pro -spec linux-g++ ../recipe-sysroot-native/usr/bin/make -f Makefile qmake_all
原因分析与解决方案
核心原因
- 子项目递归构建缺失:qthttpserver 5.15分支采用多子项目结构(sslserver是独立子模块),Yocto默认的
qmake5继承类不会自动递归处理子项目,导致主项目构建时找不到未提前编译的sslserver模块。 - Yocto Qt构建环境差异:
- Yocto构建的qtbase通常是最小化定制版本,可能未编译gui模块;而系统安装的Qt是完整版本,默认包含gui模块。
- Yocto的qmake环境变量或spec配置存在隐式依赖,错误触发gui模块检查,而系统qmake的配置更宽松或依赖链完整。
- 安装路径错误:配方中
do_install直接拷贝${S}/lib/*,但实际构建生成的库文件在构建目录${B}下,而非源码目录${S},会导致安装空文件或错误文件。
修复步骤
- 启用递归qmake构建:在配方中添加递归构建参数,让qmake自动处理所有子项目:
或在inherit qmake5 QMAKE_RECURSIVE = "1"do_configure阶段显式指定递归参数:do_configure() { qmake ${S}/qthttpserver.pro -recursive } - 检查qtbase构建配置:确保Yocto中qtbase的构建包含必要模块,可通过修改
qtbase配方或添加PACKAGECONFIG启用ssl和gui(如果需要):PACKAGECONFIG:append = " ssl gui" - 修正安装路径:将
do_install中的${S}/lib改为${B}/lib:do_install() { install -d ${libdir} cp ${B}/lib/* ${libdir}/ } - 强制子项目构建顺序:显式指定子项目编译顺序,确保sslserver先于主项目完成:
EXTRA_QMAKEVARS_PRE += "CONFIG+=ordered"
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

