必须用 self.copy 显式声明头文件路径;dst="include" 是硬性约定,src 需指向真实源目录,通配符需覆盖所有头文件类型,纯头文件库须在 package_id() 中调用 self.info.header_only()。

package() 方法里必须用 self.copy 显式声明头文件路径
Conan 不会自动扫描或递归收集头文件,所有要进包的文件都得在 package() 方法里用 self.copy() 一条条写清楚。漏掉任何一项,下游就找不到 xxx.h —— 常见报错是 #include "xxx.h" not found 或 CMake 报 CONAN_INCLUDE_DIRS 为空。
关键点:
-
dst="include"是硬性约定,不能写成dst="headers"或dst=".";否则conan_basic_setup()和find_package()无法识别 -
src参数必须指向源码中真实的头文件所在目录,比如src="src"、src="include"或src="rapidjson/include" - 通配符要写对:
"*.h"不匹配.hpp,需额外加"*.hpp";"*"会拷整个目录结构,容易带入不该进包的文件 - 纯头文件库(如 RapidJSON)可省略
build(),但package()仍不可少
header_only() 必须在 package_id() 里显式调用
如果包不含二进制(只有头文件),不加 self.info.header_only() 会导致 Conan 认为它依赖具体平台配置(os、compiler 等),从而生成多个重复包变体,浪费缓存且 CI 构建变慢。更严重的是,下游 conan install 可能因平台不匹配而失败。
正确写法示例:
def package_id(self):
self.info.header_only()
注意:这个调用必须放在 package_id() 方法内,写在 package_info() 或别处无效。
一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。
imports 不是用来打软件包,而是把头文件“拉”到项目本地
新手常混淆 package() 和 imports():前者决定「包里有什么」,后者决定「包装好后,我怎么把它解到我项目里」。想让头文件进 Conan 包,只看 package();imports 是给下游用户用的,比如:
- 嵌入式开发需要把
include/拷到 SDK 的sysroot/include - 不想依赖 Conan 缓存路径,统一用
./deps/include
conanfile.txt 中写法示例:
[imports] include, * -> ./deps/include
这行不会影响包内容本身,只影响 conan install 后的文件落地位置。
验证头文件是否真进了包:直接查缓存目录或 conanbuildinfo.cmake
光看 conan create 成功不保险。最靠谱的验证方式是手动检查:
- 运行
conan info <ref> --graph=graph.dot</ref>,然后打开graph.dot找includedirs字段 - 或者直接去缓存路径:
~/.conan/data/<name>/<version>/<user>/<channel>/package/<hash>/include/</hash></channel></user></version></name>,看里面有没有你要的头文件 - 再或者打开生成的
conanbuildinfo.cmake,搜CONAN_INCLUDE_DIRS,确认路径指向了那个package/<hash>/include</hash>
最容易被忽略的一点:conan create 默认使用 --build=missing,但如果 package() 写错,它可能静默跳过拷贝——因为没报错不等于做对了。务必人工确认缓存目录里真有东西。










