You need to enable JavaScript to run this app. 如何为给定分层架构的C++项目编写CMakeLists.txt配置
优惠活动
大模型
产品
解决方案
定价
更多

如何为给定分层架构的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 05:54:04