# C++ 第三方依赖(Conan) 本章节给出 Conan + CMake 的推荐落地方式(参考 `tsl-devkit/lsp-server/` 的实践)。 ## 1. 基本约定 - 依赖清单使用 `conanfile.txt`(或项目统一的 `conanfile.py`)。 - 本 Playbook 不内置“标准依赖集合/固定版本”;依赖选择与版本锁定由具体项目维护。 - Conan:`2.x`(本 Playbook 假设 Conan 2;不保证 Conan 1 的兼容性) - 生成器使用: - `CMakeDeps` - `CMakeToolchain` - layout 使用:`cmake_layout`(让 build 目录结构稳定可预测) ## 2. 目录与文件(建议) ```txt cpp/ conanfile.txt conan/ profiles/ --clang windows--clang-cross CMakeLists.txt CMakeUserPresets.json build/ # 本地/CI 生成,通常不入库 ``` ## 3. Profile 命名与含义(规范) - Profile 文件名按“产物平台”为前缀,避免误读: - `linux-...`:产物平台为 Linux(`[settings] os=Linux`) - `windows-...`:产物平台为 Windows(`[settings] os=Windows`) - 跨编译 profile 建议以 `-cross` 结尾(例如 `windows-x86_64-clang-cross`)。 - “工具链版本”以 profile 的 `[settings] compiler.version` 为准;如同一仓库并存多版本 clang,可将版本体现在文件名中(例如 `linux-x86_64-clang20`)。 ## 4. 安装与构建(推荐流程) 在项目的 C++ 根目录(例如 `cpp/`)下: 1. 安装依赖并生成工具链文件: - `CONAN_HOME=/tmp/conan-home conan install . -pr:b=conan/profiles/linux-x86_64-clang -pr:h=conan/profiles/windows-x86_64-clang-cross -of build/windows-x86_64-clang-cross --build=missing` - 若有 profile:`-pr:h=conan/profiles/<...> -pr:b=conan/profiles/<...>` 2. 配置 CMake: - 直接指定 toolchain: - `cmake -S . -B build/clang -G Ninja -DCMAKE_TOOLCHAIN_FILE=$PWD/build/clang/Release/generators/conan_toolchain.cmake` - 或使用 Presets(推荐,见下节): - `cmake --preset conan-release` 3. 构建: - `cmake --build --preset conan-release -j 8` 提示:如遇到 Conan 缓存/家目录权限问题,可临时设置 `CONAN_HOME=/tmp/conan-home` 再执行。 ## 5. CMake Presets(推荐做法) Conan 2 可以生成 CMake Presets(通常落在 `build/<...>/generators/CMakePresets.json`)。 推荐将一个稳定的 `CMakeUserPresets.json` 放进仓库并 include 生成文件(参考 `tsl-devkit/lsp-server/CMakeUserPresets.json`),例如: ```json { "version": 4, "vendor": { "conan": {} }, "include": ["build/clang-linux/Release/generators/CMakePresets.json"] } ``` 这样团队/CI 就可以统一使用: - 配置:`cmake --preset conan-release` - 构建:`cmake --build --preset conan-release -j 8` - 测试:`ctest --preset conan-release --output-on-failure` ## 6. 模板文件(本 Playbook) - `templates/cpp/conanfile.txt` - `templates/cpp/CMakeUserPresets.json` - `templates/cpp/conan/profiles/linux-x86_64-clang` - `templates/cpp/conan/profiles/windows-x86_64-clang-cross`