通用的CMakelists.txt 模板
通用的CMakelists.txt 模板
以下是一个通用的、模块化的 CMakeLists.txt 模板,支持 C++11/14/17 标准、多平台构建、第三方库依赖管理和单元测试集成,适用于大多数中小型项目:
# ====================== 基础配置 ======================
cmake_minimum_required(VERSION 3.12) # 最低 CMake 版本
project(MyProject
VERSION 1.0.0
LANGUAGES CXX C # 支持 C++ 和 C
DESCRIPTION "A cross-platform project template"
)
# ================ 编译器选项和标准设置 ================
set(CMAKE_CXX_STANDARD 17) # 默认 C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持指定标准
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(如 GNU g++ 的扩展)
# 平台相关配置
if(MSVC)
add_compile_options(/W4 /WX) # Windows: 开启所有警告并视警告为错误
else()
add_compile_options(-Wall -Wextra -Wpedantic -Werror) # Linux/macOS: 严格警告
endif()
# ================== 项目目录结构 ==================
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# ================== 依赖管理 ==================
# 选项:是否使用系统包管理器查找依赖
option(USE_SYSTEM_PACKAGES "Use system package manager for dependencies" ON)
# 1. 通过 find_package 查找系统安装的库
find_package(Threads REQUIRED) # 必选:线程库
# 2. 第三方库依赖(示例:spdlog)
if(USE_SYSTEM_PACKAGES)
find_package(spdlog CONFIG REQUIRED)
else()
# 通过 FetchContent 从源码构建
include(FetchContent)
FetchContent_Declare(
spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.11.0
)
FetchContent_MakeAvailable(spdlog)
endif()
# ================== 主项目构建 ==================
# 可执行文件目标
add_executable(${PROJECT_NAME}
src/main.cpp
src/core/engine.cpp
)
# 库目标(如果需要)
add_library(core_lib STATIC
src/core/utils.cpp
src/core/algorithms.cpp
)
# 链接依赖项
target_link_libraries(${PROJECT_NAME} PRIVATE
core_lib
Threads::Threads # 线程库
spdlog::spdlog # 日志库
)
# ================== 单元测试 ==================
if(BUILD_TESTING)
enable_testing()
find_package(GTest REQUIRED)
# 添加测试可执行文件
add_executable(tests
tests/test_utils.cpp
tests/test_algorithms.cpp
)
target_link_libraries(tests PRIVATE
core_lib
GTest::GTest
)
# 注册测试用例
add_test(NAME BasicTests COMMAND tests)
endif()
# ================== 安装配置 ==================
# 安装可执行文件到系统目录
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
# 安装头文件(如果项目包含库)
install(DIRECTORY include/ DESTINATION include)
# ================== 其他特性 ==================
# 代码覆盖率(仅 Debug 模式)
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(${PROJECT_NAME} PRIVATE --coverage)
target_link_libraries(${PROJECT_NAME} PRIVATE --coverage)
endif()
# 静态分析工具支持
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
option(ENABLE_CLANG_TIDY "Enable clang-tidy static analysis" OFF)
if(ENABLE_CLANG_TIDY)
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
if(CLANG_TIDY_EXE)
set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXE})
endif()
endif()
endif()
核心功能说明 :
| 模块 | 功能 |
|---|---|
| 编译器配置 | 强制 C++17 标准,开启严格警告(不同平台自适应) |
| 依赖管理 | 支持系统包(find_package)和源码集成(FetchContent)两种方式 |
| 多目标构建 | 支持可执行文件、静态库/动态库分离 |
| 单元测试 | 集成 Google Test,通过 BUILD_TESTING 控制是否编译测试 |
| 安装部署 | 规范化的 install 规则,兼容 Linux/macOS 的 FHS 标准 |
| 扩展工具 | 代码覆盖率(gcov)、clang-tidy 静态分析等可选功能 |
使用建议
1. 项目结构调整:
my_project/
├── CMakeLists.txt # 主配置文件
├── src/ # 主代码
│ ├── core/ # 核心模块
│ └── main.cpp
├── include/ # 公共头文件(如果是库)
├── tests/ # 单元测试
└── external/ # 第三方依赖(可选)
2. 常用命令:
# 基础构建
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON
cmake --build . -j8
# 运行测试
ctest -V
# 安装到系统
sudo cmake --install .
3.定制化扩展:
- 添加 CUDA 支持:enable_language(CUDA)
- 交叉编译:设置 CMAKE_TOOLCHAIN_FILE
- 包管理集成:支持 vcpkg/conan
进阶优化方向
-
模块化配置:
将大型项目拆分为多个 CMakeLists.txt,通过 add_subdirectory() 管理 -
性能分析:
集成 gperftools 或 Valgrind 支持 -
跨平台宏:
使用 configure_file() 生成平台特定的配置文件
此模板平衡了灵活性和规范性,可作为大多数 C++ 项目的起点。根据实际需求调整依赖项和编译选项即可。

浙公网安备 33010602011771号