# cn2test **Repository Path**: graviton/cn2test ## Basic Information - **Project Name**: cn2test - **Description**: conan 2 test - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-21 - **Last Updated**: 2026-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Conan2 自制 Recipe 示例 本演示项目展示了在 **Conan 2.x** 体系下如何自制 Recipe(自建包),包含完整的库包开发、测试、发布和消费流程。 --- ## 项目结构 ``` cn2test/ ├── pyproject.toml # Python 项目元数据(管理 Conan CLI、Pyright 等工具) ├── uv.lock # uv 依赖锁定文件 ├── .python-version # Python 版本锁定:3.14 ├── README.md # 本文档 │ ├── mylib/ # 自制 C++ 库包(Recipe + 源码) │ ├── conanfile.py # Conan2 Recipe(核心) │ ├── CMakeLists.txt # 库构建脚本 │ ├── include/mylib/ │ │ └── mylib.h # 公开头文件 │ ├── src/ │ │ └── mylib.cpp # 库实现 │ ├── cmake/ │ │ └── mylib-config.cmake.in # CMake 包配置模板 │ └── test_package/ # 包验证测试(Conan2 标准做法) │ ├── conanfile.py │ ├── CMakeLists.txt │ └── src/test.cpp │ ├── consumer/ # 消费方示例(独立项目) │ ├── conanfile.py # 消费者 Conan 配置(使用 CMakeConfigDeps) │ ├── CMakeLists.txt │ └── src/main.cpp │ └── backup/ └── conanfile.txt # consumer 的旧版 conanfile.txt 备份 ``` --- ## 环境要求 | 工具 | 版本/说明 | | ---------- | ---------------------------------------- | | **Conan** | >= 2.27.1 | | **CMake** | >= 3.15(本机使用 4.3.1) | | **Python** | 3.14(由 `.python-version` + `uv` 管理) | | **编译器** | MSVC (Visual Studio 2026 v18.5) | > Windows 下使用 MSVC 时,必须先进入 **Developer PowerShell for VS**,确保 `cl.exe` 等工具在 `PATH` 中。 ### Python 工具链初始化 ```bash # 使用 uv 安装 Python 依赖(conan、pyright 等) uv sync ``` --- ## 1. mylib — 自制库包 ### 核心:conanfile.py | 方法 | 阶段 | 作用 | | ---------------- | ------ | ----------------------------------------------- | | `layout()` | 初始化 | 定义源码/构建/包目录结构,**editable 模式必需** | | `generate()` | 生成 | 产出 `conan_toolchain.cmake`、Find 模块等 | | `build()` | 构建 | 调用 CMake 编译 | | `package()` | 打包 | 将产物安装到 `package_folder` | | `package_info()` | 消费 | **定义 `cpp_info`,决定下游如何链接** | **源码管理方式**:`exports_sources`(源码内嵌),适合 recipe 与源码同仓库的小型库。 ### 构建并测试包 ```powershell # 进入 VS Developer Shell 环境(MSVC 工具链) Import-Module "C:\Program Files\Microsoft Visual Studio\18\Professional\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" Enter-VsDevShell 4be89d07 -SkipAutomaticLocation -DevCmdArguments "-arch=x64" cd mylib conan create . --build=missing ``` 成功后会自动运行 `test_package`,验证包是否能被下游正确消费。 输出示例: ``` Testing mylib/mylib/1.0.0 All tests passed! ``` --- ## 2. test_package — 包验证机制 `test_package` 是 Conan2 的**包测试标准做法**: - 在 `conan create` 时自动触发 - 模拟真实消费者,验证 `package_info()` 配置是否正确 - 测试可执行文件会链接到刚构建好的包并运行 关键点:`self.requires(self.tested_reference_str)` 自动引用被测包。 --- ## 3. consumer — 消费方 演示另一个独立项目如何依赖 `mylib`。consumer 使用 **Conanfile.py** 方式(而非简单的 `conanfile.txt`),并配置了 `CMakeConfigDeps` 生成器,展示了如何自定义 CMake target 名称: ```python deps = CMakeConfigDeps(self) deps.set_property("mylib", "cmake_target_name", "CustomAlias::MyLib") ``` ### 构建与运行 ```powershell # 同样需要在 Developer Shell 中 cd consumer # 1. 安装依赖(拉取 mylib 并生成 toolchain) conan install . --build=missing # 2. 使用 CMake 构建(利用 conan 生成的 preset) cmake --preset conan-default cmake --build --preset conan-release # 3. 运行 .\build\Release\consumer.exe ``` 输出示例: ``` === Conan2 Consumer Demo === Using library: mylib/1.0.0 add(6, 7) = 13 mul(6, 7) = 42 square(6) = 36 ``` --- ## 关键概念速查 ### package_info() 的重要性 ```python def package_info(self): self.cpp_info.libs = ["mylib"] self.cpp_info.includedirs = ["include"] if self.settings.os == "Linux": self.cpp_info.system_libs = ["pthread", "dl"] ``` 这决定了下游消费者的编译命令中会出现哪些 `-I`、`-L`、`-l`。 ### Editable 开发模式 ```bash # 在库源码目录执行,消费者可直接引用本地源码,无需反复 export cd mylib conan editable add . mylib/1.0.0 ``` ### 常用命令 ```bash # 查看本地缓存中的包 conan list "mylib/*" # 查看包详情 conan list "mylib/1.0.0:*" -p # 上传到远程仓库 conan remote add myrepo conan upload mylib/1.0.0 -r myrepo --confirm # 清理缓存 conan remove "mylib/*" -c # 同步 Python 依赖 uv sync ``` --- ## 代码风格要点 ### C++ - 使用 **C++11** 标准。 - 头文件使用 `#ifndef` / `#define` / `#endif` 宏卫士。 - Windows 下支持 `__declspec(dllexport/dllimport)`,由 CMake 的 `mylib_EXPORTS` 宏控制;静态库时宏为空。 - 命名空间统一使用 `mylib::`,公开 API 使用 `MYLIB_API` 宏标记。 ### Python(Conan Recipe) - 必须实现 `layout()`、`generate()`、`build()`、`package()`、`package_info()` 五个阶段方法。 - `package_info()` 是核心:必须正确设置 `self.cpp_info.libs`、`self.cpp_info.includedirs`。 - 跨平台条件判断(如 `fPIC`、系统库 `pthread`)放在 `config_options()` 或 `package_info()` 中。 ### CMake - 最低版本 `cmake_minimum_required(VERSION 3.15)`。 - 使用现代 CMake 目标导出方式:`install(EXPORT ... NAMESPACE mylib::)`。 - 公开头文件目录使用生成器表达式: ```cmake target_include_directories(mylib PUBLIC $ $ ) ```