如何为给定分层架构的C++项目编写CMakeLists.txt配置
适配该项目架构的CMake分层配置方案
整体采用「子模块编译为静态库再统一链接到主程序」的方案,各层级CMakeLists.txt编写内容如下:
1. 根目录CMakeLists.txt(放在与src目录平级的位置)
cmake_minimum_required(VERSION 3.16) # 替换成你自己的项目名 project(MyDemoProject) # 设置C++标准,可根据自己的需求调整版本 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(src)
2. src目录下的CMakeLists.txt
# 编译所有子模块 add_subdirectory(control) add_subdirectory(factory) add_subdirectory(model) add_subdirectory(ui) # 编译主程序 add_executable(${PROJECT_NAME} main.cpp) # 链接所有子模块静态库到主程序 target_link_libraries(${PROJECT_NAME} PRIVATE control factory model ui)
3. 各子模块目录下的CMakeLists.txt
control、factory、ui目录写法完全一致,以control目录为例:
# 自动收集当前目录下所有cpp源文件 file(GLOB CONTROL_SRCS *.cpp) # 编译为静态库 add_library(control STATIC ${CONTROL_SRCS}) # 暴露当前目录头文件路径,其他模块引用头文件时不需要写相对路径 target_include_directories(control PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 如当前模块依赖其他子模块/第三方库,在这里添加链接即可,示例: # target_link_libraries(control PRIVATE model Qt5::Core)
使用时只需把代码中的control替换为对应目录名即可,比如factory目录就替换成factory。
model目录写法
和上面的逻辑完全一致,只是模块名替换为model即可:
file(GLOB MODEL_SRCS *.cpp) add_library(model STATIC ${MODEL_SRCS}) target_include_directories(model PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
注意事项
- 若追求配置稳定性,可不用
file(GLOB)自动收集源文件,改为手动列出:set(CONTROL_SRCS file.cpp),新增源文件时手动更新该配置即可 - 模块间依赖只需在依赖方的CMakeLists.txt中配置,不需要在上层主程序配置重复依赖
- 若需要链接第三方库,直接在对应模块的
target_link_libraries中添加库名即可
构建命令
在项目根目录执行以下命令即可完成编译:
mkdir build && cd build cmake .. make
内容的提问来源于stack exchange,提问作者Sevla
相关产品推荐
相关产品推荐

