通用的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++ 项目的起点。根据实际需求调整依赖项和编译选项即可。

posted @ 2025-05-09 19:40  michaelchengjl  阅读(246)  评论(0)    收藏  举报