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

基于CMake从源码构建Qt5.6及应用的依赖查找问题求助

解决CMake+Ninja跨平台构建Qt5.6及依赖应用的阶段构建问题

我之前也碰到过一模一样的困境——要同时构建Qt和依赖它的应用时,CMake的find_package(Qt5Core)总因为Qt还没编译完成而失败。核心解法是把Qt的编译封装成独立的预构建阶段,让应用的构建严格依赖Qt编译完成后的安装产物,用CMake的ExternalProject_Add就能完美实现这个流程,下面是具体的步骤和配置:

核心思路

借助CMake的ExternalProject_Add模块,将Qt的编译、安装打包成一个单独的构建目标,然后让你的应用项目依赖这个目标。这样Ninja会先完成Qt的编译和安装,再执行应用项目的CMake配置(此时Qt已经存在于指定的安装目录,find_package就能正常工作了)。

具体CMake配置示例

下面是一个跨平台的主CMakeLists.txt,已经针对Windows(VS)和Mac(Clang)做了适配:

cmake_minimum_required(VERSION 3.5)
project(QtAndAppBuild)

# 配置Qt的相关路径和参数
set(QT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/qt5.6-src" CACHE PATH "Qt5.6源码路径")
set(QT_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt5.6-install" CACHE PATH "Qt5.6安装路径")
set(CMAKE_BUILD_TYPE Release CACHE STRING "构建类型")

# 引入ExternalProject模块
include(ExternalProject)

# 根据平台配置Qt的configure命令
if(WIN32)
    # Windows下先初始化VS2015环境(Qt5.6对VS版本的要求)
    set(VARSALL_PATH "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat")
    set(QT_CONFIGURE_COMMAND 
        cmd /c "call \"${VARSALL_PATH}\" x64 && \"${QT_SOURCE_DIR}/configure.bat\" 
        -prefix \"${QT_INSTALL_DIR}\" 
        -platform win32-msvc2015 
        -opensource -confirm-license 
        -nomake examples -nomake tests 
        -${CMAKE_BUILD_TYPE}"
    )
elseif(APPLE)
    set(QT_CONFIGURE_COMMAND 
        "${QT_SOURCE_DIR}/configure" 
        -prefix "${QT_INSTALL_DIR}" 
        -platform macx-clang 
        -opensource -confirm-license 
        -nomake examples -nomake tests 
        -${CMAKE_BUILD_TYPE}
    )
endif()

# 定义Qt的构建目标
ExternalProject_Add(Qt5Build
    SOURCE_DIR "${QT_SOURCE_DIR}"
    BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt5.6-build"
    INSTALL_DIR "${QT_INSTALL_DIR}"
    CONFIGURE_COMMAND ${QT_CONFIGURE_COMMAND}
    BUILD_COMMAND ninja
    INSTALL_COMMAND ninja install
    BUILD_ALWAYS OFF
)

# 定义你的应用构建目标(严格依赖Qt5Build)
ExternalProject_Add(MyApplication
    SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/my-app"
    BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/my-app-build"
    CMAKE_ARGS 
        -DCMAKE_PREFIX_PATH="${QT_INSTALL_DIR}"
        -DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}"
        -DCMAKE_GENERATOR=Ninja
    DEPENDS Qt5Build
)

关键细节解释

  1. Qt编译配置:

    • 针对Windows和Mac分别指定了Qt的平台编译参数(win32-msvc2015和macx-clang)
    • 用-nomake examples -nomake tests跳过示例和测试编译,大幅加快构建速度
    • 指定独立的安装目录QT_INSTALL_DIR,确保CMake后续能准确定位到Qt的库、头文件和工具
  2. 应用依赖控制:

    • 通过DEPENDS Qt5Build让应用的构建必须等待Qt编译安装完成后才启动
    • 在应用的CMAKE_ARGS中传递CMAKE_PREFIX_PATH,明确告诉CMake去哪里找已经安装好的Qt
  3. Windows环境适配:

    • 先调用VS的vcvarsall.bat初始化编译器环境,否则Qt的configure脚本无法找到VS工具链
    • 路径中的空格要加引号转义,避免命令解析出错

执行步骤

  1. 将Qt5.6的源码解压到指定的qt5.6-src目录
  2. 把你的应用源码放在my-app目录(确保应用的CMakeLists.txt中包含find_package(Qt5Core REQUIRED)等正确的Qt依赖配置)
  3. 创建一个build目录,进入后运行CMake命令:
    • Windows:
      cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DQTM_SOURCE_DIR=../qt5.6-src
      
    • Mac:
      cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DQTM_SOURCE_DIR=../qt5.6-src
      
  4. 运行ninja,此时Ninja会先编译并安装Qt,再自动配置并编译你的应用

常见问题排查

  • Windows下VS环境找不到:如果你的VS版本不是2015或安装路径不同,修改VARSALL_PATH到对应版本的vcvarsall.bat路径
  • Qt编译失败:确保Perl、Python(Qt5.6编译依赖)已经添加到系统PATH中;Mac下要安装Xcode命令行工具
  • 应用找不到Qt:检查QT_INSTALL_DIR是否正确,Qt安装完成后该目录下会有lib、include、bin等标准Qt安装结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:52