You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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}/* \
"

构建过程中遇到以下问题:

  1. Yocto自动构建时抛出错误:Project ERROR: Unknown module(s) in QT: sslserver,推测是sslserver子项目未被优先构建
  2. 在构建目录下使用Yocto提供的qmake手动执行:
    ../recipe-sysroot-native/usr/bin/qmake ../git/qthttpserver.pro -spec linux-g++
    ../recipe-sysroot-native/usr/bin/make -f Makefile qmake_all
    
    出现错误:Project ERROR: Unknown module(s) in QT: gui,但项目代码中并未引用gui模块
  3. 使用本地系统安装的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
    
    构建完全正常

原因分析与解决方案

核心原因

  1. 子项目递归构建缺失:qthttpserver 5.15分支采用多子项目结构(sslserver是独立子模块),Yocto默认的qmake5继承类不会自动递归处理子项目,导致主项目构建时找不到未提前编译的sslserver模块。
  2. Yocto Qt构建环境差异:
    • Yocto构建的qtbase通常是最小化定制版本,可能未编译gui模块;而系统安装的Qt是完整版本,默认包含gui模块。
    • Yocto的qmake环境变量或spec配置存在隐式依赖,错误触发gui模块检查,而系统qmake的配置更宽松或依赖链完整。
  3. 安装路径错误:配方中do_install直接拷贝${S}/lib/*,但实际构建生成的库文件在构建目录${B}下,而非源码目录${S},会导致安装空文件或错误文件。

修复步骤

  1. 启用递归qmake构建:在配方中添加递归构建参数,让qmake自动处理所有子项目:
    inherit qmake5
    QMAKE_RECURSIVE = "1"
    
    或在do_configure阶段显式指定递归参数:
    do_configure() {
        qmake ${S}/qthttpserver.pro -recursive
    }
    
  2. 检查qtbase构建配置:确保Yocto中qtbase的构建包含必要模块,可通过修改qtbase配方或添加PACKAGECONFIG启用ssl和gui(如果需要):
    PACKAGECONFIG:append = " ssl gui"
    
  3. 修正安装路径:将do_install中的${S}/lib改为${B}/lib:
    do_install() {
        install -d ${libdir}
        cp ${B}/lib/* ${libdir}/
    }
    
  4. 强制子项目构建顺序:显式指定子项目编译顺序,确保sslserver先于主项目完成:
    EXTRA_QMAKEVARS_PRE += "CONFIG+=ordered"
    

内容的提问来源于stack exchange,提问作者Dane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:57:33