【CMake】4.单项目多模块示例工程

本文详细介绍了如何使用CMake构建一个包含主模块和子模块的单项目示例工程,涉及CMakeLists.txt配置、模块依赖、目录结构以及VSCode的头文件路径设置。

CMake 示例工程代码

https://github.com/LABELNET/cmake-simple

单项目多模块示例工程

https://github.com/LABELNET/cmake-simple/tree/main/simple-mod

1. 多模块工程

CMake 多模块工程,这是一个示例工程

  • simple-mod , 项目名称
  • demo , 主模块 main ,引用 store 模块时,需配置依赖
  • store , 子模块 store

2. 目录结构

$ SIMPLE-MOD      
│   CMakeLists.txt                 # 项目根 CMakeLists.txt,多模块
│   README.md                      # 说明文档,无关
├───.vscode                        # 头文件路径配置
│       c_cpp_properties.json
├───build                          # CMake 编译输出
├───cmake                          # 第三方依赖存放路径
├───demo                           # 主模块 main
│   │   CMakeLists.txt             # 主模块 CMakeLists.txt ,配置子模块链接
│   │
│   ├───include                    # 源码: 主模块头文件
│   │       demo_utils.h   
│   │  
│   └───src                        # 源码: 主模块源码实现
│           demo_utils.cc
│           main.cc                
│
└───store                          # 子模块
    │   CMakeLists.txt             # 子模块 CMakeLists.txt ,本地依赖包
    │
    ├───include                    # 源码: 子模块头文件
    │       store_utils.h
    │
    └───src                        # 源码: 子模块源码实现
            store_utils.cc

3. 项目/CMakeLists.txt

以项目配置为主,注意配置各个模块

  • add_subdirectory(demo) , 主模块
  • add_subdirectory(store) ,子模块
cmake_minimum_required(VERSION 3.18)

# 1.编译类型
if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

# 2. C++ 标准库
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 3. 第三方库
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake;${CMAKE_MODULE_PATH}")

# 4.工程名称
project(simple-mod LANGUAGES CXX)

# 5.主模块 main
add_subdirectory(demo)

# 6.子模块 store
add_subdirectory(store)


# 7. Windows 异常
if (WIN32)
    add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES)
endif()

# 8.使用编译缓存,提升编译速度
if (NOT MSVC)
    find_program(CCACHE_PROGRAM ccache)
    if (CCACHE_PROGRAM)
        message(STATUS "Found CCache: ${CCACHE_PROGRAM}")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PROGRAM})
    endif()
endif()

4. 主模块/CMakeLists.txt

以功能实现为主,注意

  • target_link_libraries , 链接了子模块
cmake_minimum_required(VERSION 3.18)

# 1.可执行文件
add_executable(demo)

# 2.源码,注意: 源文件代码格式,这里用的为 .cc 文件
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h)

# 3.目标
target_sources(demo PUBLIC ${srcs})

# 4.头文件
target_include_directories(demo PUBLIC include)

# 5.本地依赖模块
target_link_libraries(demo PUBLIC store)

5. 子模块/CMakeLists.txt

以功能代码实现为主,注意

  • add_library(store OBJECT ${srcs}),对象链接方式,将会被一起打包到可执行程序
cmake_minimum_required(VERSION 3.18)

# 1.源码,注意: 源文件代码格式,这里用的为 .cc 文件 , 若为 cpp 后缀自行添加
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h)

# 2.静态链接库
# add_library(store STATIC ${srcs})
# 2.1 动态链接库
# add_library(store SHARED ${srcs})
# 2.2 对象链接库(推荐)
add_library(store OBJECT ${srcs})
# 3.头文件
target_include_directories(store PUBLIC include)

6. 头文件红线问题

使用 vscode 的 c_cpp_properties 进行配置 includePath 即可。见示例工程的 .vscode 文件夹内容

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${default}",
                "${workspaceFolder}/demo/include",
                "${workspaceFolder}/store/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值