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
}