如何组织共用公共文件的C++后端、GUI项目的仓库与目录结构?
C++多模块项目仓库与结构规划方案
一、仓库选择建议
你因为CMake单项目不支持多编译器必须拆分独立CMake项目,不需要强制拆分Git仓库,优先推荐单仓库多独立子项目方案,仅在有独立发版、分权限管控需求时才拆分多仓库。
单仓库多子项目方案(优先)
- 目录结构规划:
项目根目录/ ├── backend/ # 原有后端独立CMake项目 ├── gui/ # 新建GUI独立CMake项目 └── common/ # 公共库、公共头文件,本身为独立CMake库项目 - 编译器适配:backend和gui是完全独立的CMake项目,可分别配置不同编译器,CLion支持单仓库内加载多个独立CMake项目,也可以分别打开子目录作为项目根目录配置编译链,完全满足你的要求
- 公共文件共享:common作为独立CMake静态/接口库,backend和gui的CMakeLists.txt直接引入即可,无需额外同步操作,公共代码修改实时生效,没有多仓库版本同步的冗余成本
多独立仓库方案(按需选择)
如果需要两个模块独立发版、单独维护权限,再按这个方案实现:
- 新建三个独立Git仓库:后端仓库、GUI仓库、公共依赖common仓库
- 在后端和GUI仓库中,通过Git子模块引入common仓库:
git submodule add <common仓库地址> common - 公共文件同步操作:
- 拉取代码时需要同步子模块:
git submodule update --init --recursive - 修改公共代码后,需要先提交common仓库的更新,再分别在后端、GUI仓库更新子模块的指向commit
- 拉取代码时需要同步子模块:
二、CMake配置示例
common目录的CMakeLists.txt参考:
cmake_minimum_required(VERSION 3.16) project(common) # 如果是仅头文件的公共库用add_library(common INTERFACE)即可 add_library(common STATIC src/string_utils.cpp include/string_utils.h include/type_def.h ) target_include_directories(common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
后端/ GUI项目的CMakeLists.txt引入公共库的代码:
# 引入公共库 add_subdirectory(../common ${CMAKE_BINARY_DIR}/common_build) # 关联到当前项目的目标 target_link_libraries(your_backend_target PRIVATE common)
三、参考开源项目案例
以下都是采用「核心逻辑后端 + 独立GUI + 公共依赖」拆分的CMake项目,可直接参考其目录和配置结构:
- 多媒体处理工具类:开源视频剪辑工具OBS Studio的核心编码模块与GUI层拆分方案
- 开发工具类:CMake自带的GUI模块cmake-gui与核心逻辑的拆分实现
- 加密工具类:KeePassXC的密码存储核心逻辑与桌面GUI的拆分架构
内容的提问来源于stack exchange,提问作者zenno2
相关产品推荐
相关产品推荐

