conan create 要求 conanfile.py 必须定义 name 和 version 两个强制字段,且源码路径需与 exports_sources 或 layout 对齐,settings/options 必须覆盖目标平台差异,generate/build 阶段需正确声明工具链依赖,package() 中 self.copy 需确保匹配到文件,否则静默失败。

必须先有可编译的源码结构和明确的构建逻辑,否则 conan create 会直接失败。
conanfile.py 必须定义 name 和 version
Conan 2.x 不再接受无名包。name 和 version 是包身份的强制字段,不能靠命令行传入或留空:
-
name必须是合法标识符(如fmt、mylib),不能含斜杠或大写字母 -
version推荐用语义化版本(如"10.2.1"),字符串形式,不能是变量或函数调用 - 如果项目根目录下没有
conanfile.py,或者它没定义这两个属性,conan create .会报错AttributeError: 'MyConan' object has no attribute 'name'
源码路径要和 layout 或 exports_sources 对齐
Conan 默认不自动包含源码。你得显式告诉它哪些文件属于这个包:
- 用
exports_sources = "src/*", "include/*"把源文件复制进包缓存(适合小项目) - 或用
def source(self): git clone ...+self.copy(...)在source()阶段拉取并整理(推荐用于外部仓库) - 若用了
cmake_layout(),则默认期望源码在src/目录;否则conan build可能找不到CMakeLists.txt - 常见错误:
ERROR: conanfile.py doesn't declare 'exports_sources'或构建时提示Cannot open source file
settings 和 options 要覆盖目标平台真实差异
Conan 用 settings(如 os, compiler)和 options(如 shared, fPIC)区分二进制变体。漏写会导致:
- 包无法被其他项目正确匹配(比如 Windows 上构建的包,在 Linux
conan install时根本不会被选中) -
conan create时因缺少必要 setting 崩溃,例如没声明"arch"却在 profile 里指定了arch=x86_64 - 动态库开关没定义
options = {"shared": [True, False]},下游项目就无法通过-o mylib:shared=True控制链接方式
generate() 和 build() 阶段不能依赖未声明的工具链
如果你在 generate() 里用 CMakeToolchain,或在 build() 里调 CMake().configure(),就得确保:
- 已声明
tool_requires(如self.tool_requires("cmake/3.25.2")),否则conan create会提示Command 'cmake' not found - 没混用旧版 generator(如
cmake_find_package)和新版 toolchain —— Conan 2.x 中二者冲突,生成的文件互相覆盖 -
generate()里不能做耗时操作(如下载、解压),它只应生成配置文件;重活放source()或build()
真正容易被忽略的是:Conan 不校验你写的 package() 是否真把头文件和库拷对了位置。哪怕 conan create 显示成功,find_package() 仍可能报 Could not find fmtConfig.cmake —— 因为 self.copy("*.h", dst="include") 没匹配到任何文件,而 Conan 默认静默跳过空拷贝。











