基于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 )
关键细节解释
Qt编译配置:
- 针对Windows和Mac分别指定了Qt的平台编译参数(
win32-msvc2015和macx-clang) - 用
-nomake examples -nomake tests跳过示例和测试编译,大幅加快构建速度 - 指定独立的安装目录
QT_INSTALL_DIR,确保CMake后续能准确定位到Qt的库、头文件和工具
- 针对Windows和Mac分别指定了Qt的平台编译参数(
应用依赖控制:
- 通过
DEPENDS Qt5Build让应用的构建必须等待Qt编译安装完成后才启动 - 在应用的
CMAKE_ARGS中传递CMAKE_PREFIX_PATH,明确告诉CMake去哪里找已经安装好的Qt
- 通过
Windows环境适配:
- 先调用VS的
vcvarsall.bat初始化编译器环境,否则Qt的configure脚本无法找到VS工具链 - 路径中的空格要加引号转义,避免命令解析出错
- 先调用VS的
执行步骤
- 将Qt5.6的源码解压到指定的
qt5.6-src目录 - 把你的应用源码放在
my-app目录(确保应用的CMakeLists.txt中包含find_package(Qt5Core REQUIRED)等正确的Qt依赖配置) - 创建一个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
- Windows:
- 运行
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
相关产品推荐
相关产品推荐

