样例库# 请粗略浏览 cmake 文档 以结合理解本篇示例。 CMake 示例 环境配置 CMake 基础 hello-cmake 包含头文件 各种可用变量 源文件变量(不建议!) 包含静态库 核心概念 创建静态库 包含目录配置 链接库文件 构建流程 创建并链接共享库 添加共享库 别名目标 链接共享库 构建示例 make install 核心概念 安装机制 文件安装 构建验证 高级配置 自定义安装路径 暂存安装 卸载机制 环境配置 构建示例 构建类型 设置构建类型 设置默认构建类型 构建示例 编译标志 设置目标特定的 C++ 标志 设置默认 C++标志 设置 CMake 标志 构建示例 包含第三方库 查找包 检查包是否找到 导出的变量 别名/导入目标 非别名目标 构建示例 使用 clang 编译 设置标志 构建示例 使用 ninja 构建 生成器 命令行构建工具生成器 IDE 构建工具生成器 其他生成器 调用生成器 构建示例 导入目标 导入目标 构建示例 C++标准 C++标准常见方法 检查编译标志 添加标志 构建示例 设置 C++标准 使用 CXX_STANDARD 属性 构建示例 target_compile_features 设置 C++标准 使用 target_compile_features 构建示例 子项目管理示例 基本子项目 添加子目录 引用子项目目录 纯头文件库 从子项目引用库 包含子项目的目录 构建示例 合并多个动态库为单个动态库 一、项目结构设计 二、模块目录配置(module1/CMakeLists.txt) 三、根目录配置(CMakeLists.txt) 四、关键技术解析 五、构建与验证 六、高级场景处理 1. 动态库合并(非推荐方案) 2. 跨平台兼容 3. 符号冲突解决 七、性能优化建议 八、常见问题排查 项目结构说明 包含的示例 最佳实践 代码生成 配置文件生成 配置文件 构建示例 使用 Google Protocol Buffers 生成 C++源代码 导出的变量 生成源代码 生成文件 构建示例 静态分析 Clang 静态分析器 scan-build scan-build 输出 构建示例 Clang 格式化 clang-format 格式风格 目标 format 格式 format-check 格式检查 format-check-changed 格式检查已更改 单元测试 Boost 单元测试框架 启用测试 添加测试可执行文件 添加测试 构建示例 Catch2 单元测试框架 Vendoring catch2 Catch2 接口库 使用 C++11 构建 启用测试 添加测试可执行文件 添加测试 示例 Google 测试单元测试框架 下载并构建 Google Test 启用测试 添加测试可执行文件 添加测试 构建示例 安装程序 创建 deb 文件 CPack 生成器 Debian 软件包设置 构建示例 包管理 使用系统提供的包管理器 代码管理 包含第三方代码 使用 git 来管理代码 示例 外部项目 标准 替代方法 Conan ROOT 测试 简单的 ROOT 项目:UseFile 系统 examples/root-usefile/CMakeLists.txt examples/root-usefile/SimpleExample.cxx 简单的 ROOT 项目:使用目标系统 examples/root-simple/CMakeLists.txt examples/root-simple/SimpleExample.cxx ROOT 字典示例 examples/root-dict/CMakeLists.txt 支持文件 examples/root-dict/DictExample.cxx examples/root-dict/DictExample.h examples/root-dict/DictLinkDef.h 测试 examples/root-dict/CheckLoad.C Conan 样例 ConanFile 方法示例 当 Conanfile 位于子文件夹中时声明布局 为第三方库创建包时声明布局 当有多个子项目时声明布局 使用组件和可编辑包 定义 Conan 包中提供多个库的组件 依赖图示例 使用依赖项中的 CMake 宏 在 tool_requires 中透明地使用 cmake 模块 依赖同一 tool-require 的不同版本 依赖相同版本的 tool-require 但使用不同选项 使用相同的依赖作为 requires 和 tool_requires 开发者工具和流程 使用 MinGW 作为 tool_requires 在 Windows 上使用 gcc 构建 Conan 命令 使用 packages-lists 列出包并下载它们 从远程下载并上传到不同的远程 构建和上传软件包 删除软件包列表 Conan 插件示例 自定义命令:清理旧配方和包版本 定位命令 运行它 代码导览 parser 用户输出 Conan 公共 API 为开发者创建与 Conan 无关的依赖部署 从所有依赖项复制源代码 定位部署器 运行它 代码导览 deploy() Conan 配方工具示例 CMake CMakeToolchain: 使用 CMakePresets 构建你的项目 生成工具链 使用 CMakePresets 构建项目 CMakeToolchain: 使用 Conan 生成的预设扩展你的 CMakePresets CMakeToolchain: 将任意 CMake 变量注入依赖项 CMakeToolchain: 在包内使用 xxx-config.cmake 文件 重要注意事项 使用不同生成器与 CMakeToolchain:Ninja 示例 理解 CMake 生成器 在配置文件中默认使用 Ninja 生成器 CMakeToolchain: 使用 LLVM/Clang Windows 编译器 使用 clang 的 LLVM/Clang GNU 风格前端 LLVM/Clang with clang-cl 类似 MSVC 的前端 MSVC Clang 组件(ClangCL Visual Studio 工具集) Meson 使用 Conan 构建简单的 Meson 项目 使用 Meson 创建 Conan 包 修补源代码 使用‘replace_in_file’进行修补 在 source() 方法 在 build() 方法中 使用“patch”工具进行补丁操作 使用“apply_conandata_patches”工具进行补丁操作 捕获 Git scm 信息 凭证管理 系统包 将系统需求封装在 Conan 包中 仅在使用构建包时消耗系统需求 将系统包作为构建需求消耗 Conan 包包装器 在 build() 方法中直接消费系统包