如何让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
相关产品推荐
相关产品推荐

