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

如何让QtCreator中CMake构建依赖另一个CMake项目?

问题描述

我有一个生成静态库的CMake项目,在Qt Creator中编译正常,构建目录会生成库文件,其CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.5)

project(mystaticlib VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

file(GLOB mystaticlib_SRC "src/**.cpp")
add_library( mystaticlib STATIC
    ${mystaticlib_SRC}
)
target_include_directories( mystaticlib PRIVATE include/mystaticlib INTERFACE include )

现在我有一个Qt应用项目,希望依赖上述静态库项目,我理想中的配置逻辑(非有效代码)如下:

cmake_minimum_required(VERSION 3.25)

project(MyQtProject VERSION 0.1 LANGUAGES CXX)

# 想象中的逻辑,非实际代码
include_project(mystaticlib, "~/my_projects/mystaticlib/CMakeLists.txt")
set(HEADERS_mystaticlib get_project_headers(mystaticlib))
# 想象逻辑结束
add_executable(MyQtProjectEXE ${PROJECT_SOURCES})
target_link_libraries(MyQtProjectEXE mystaticlib)
target_include_directories(MyQtProjectEXE HEADERS_mystaticlib)

请问该如何实现这一需求?实际使用中,我希望能在CMake配置阶段设置依赖项目的任意路径。

实现方案

方法1:使用add_subdirectory(推荐)

这是CMake中引入子项目最直接的方式,支持配置阶段指定任意路径,且能自动处理依赖的头文件和库链接。

修改Qt项目的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.25)

project(MyQtProject VERSION 0.1 LANGUAGES CXX)

# 定义可配置的路径变量,默认值可自定义,配置阶段可修改
set(MYSTATICLIB_DIR "~/my_projects/mystaticlib" CACHE PATH "Path to mystaticlib project directory")

# 引入静态库子项目,第二个参数为子项目独立构建目录,避免和主项目文件混淆
add_subdirectory(${MYSTATICLIB_DIR} mystaticlib_build)

# 添加Qt应用可执行文件
add_executable(MyQtProjectEXE ${PROJECT_SOURCES})

# 链接静态库,CMake会自动继承静态库的INTERFACE头文件路径
target_link_libraries(MyQtProjectEXE PRIVATE mystaticlib)

# --- 以下为Qt项目常规配置(保留原有内容即可) ---
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

target_link_libraries(MyQtProjectEXE PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(MyQtProjectEXE PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(MyQtProjectEXE)
endif()

路径配置方式:

  • Qt Creator界面:打开项目构建→CMake配置面板,找到MYSTATICLIB_DIR变量,修改为静态库项目实际路径。
  • 命令行配置:运行CMake时指定路径
    cmake -S . -B build -DMYSTATICLIB_DIR="/实际路径/mystaticlib"
    

方法2:使用find_package(适合已安装的库)

如果静态库已安装到系统或指定路径,可通过find_package引入,需先给静态库添加安装规则:

第一步:修改静态库的CMakeLists.txt,添加安装规则

cmake_minimum_required(VERSION 3.5)

project(mystaticlib VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

file(GLOB mystaticlib_SRC "src/**.cpp")
add_library( mystaticlib STATIC
    ${mystaticlib_SRC}
)
target_include_directories( mystaticlib PRIVATE include/mystaticlib INTERFACE include )

# 添加安装规则
install(TARGETS mystaticlib
    EXPORT mystaticlibTargets
    ARCHIVE DESTINATION lib
)

install(EXPORT mystaticlibTargets
    FILE mystaticlibConfig.cmake
    DESTINATION lib/cmake/mystaticlib
)

install(DIRECTORY include/
    DESTINATION include
)

编译并安装静态库:

cmake -S . -B build
cmake --build build
cmake --install build --prefix "/安装路径/mystaticlib"

第二步:修改Qt项目的CMakeLists.txt

cmake_minimum_required(VERSION 3.25)

project(MyQtProject VERSION 0.1 LANGUAGES CXX)

# 指定静态库配置文件路径
set(mystaticlib_DIR "/安装路径/mystaticlib/lib/cmake/mystaticlib" CACHE PATH "Path to mystaticlib config files")

# 查找静态库
find_package(mystaticlib REQUIRED)

# 添加Qt应用可执行文件
add_executable(MyQtProjectEXE ${PROJECT_SOURCES})

# 链接库
target_link_libraries(MyQtProjectEXE PRIVATE mystaticlib Qt${QT_VERSION_MAJOR}::Widgets)

# 其余Qt常规配置同上...
关键说明
  • add_subdirectory无需提前编译静态库,CMake会自动构建子项目,且保持主项目与子项目编译配置一致(如C++标准),适合开发阶段使用。
  • 由于静态库已通过target_include_directories设置INTERFACE include,链接后Qt项目会自动获得头文件路径,无需手动添加。

内容的提问来源于stack exchange,提问作者Tomáš Zato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:31:21