应使用conan export-pkg直接打包本地已编译的二进制,配合严格匹配构建环境的profile和正确conanfile.py,再通过conan upload上传至远程仓库。

用 conan export-pkg 直接发布本地已编译的二进制
如果你的内部库已经用 CMake/MSVC/Make 编译好了(比如有 libmylib.a、mylib.dll、include/mylib.h),就别走 conan create 流程了——它会强制重新构建,浪费时间还可能污染缓存。
直接用 conan export-pkg 把现成文件打成包,关键点是写对 conanfile.py 并指定路径:
-
package()方法里只调用self.copy()拷文件,不写build() - 运行命令时必须加
--profile显式声明目标配置(如default或自定义 profile),否则 Conan 无法推断settings,上传后别人find_package()会找不到匹配项 - 确保
conanfile.py中settings和你实际编译环境一致(比如"os=Windows", "compiler=msvc", "compiler.version=193", "build_type=Release")
profile 必须和二进制真实构建环境严格一致
Conan 的二进制包名包含完整 settings 哈希,哪怕 compiler.version 差一个点(比如 192 vs 193),或 build_type 混用 Debug/RelWithDebInfo,都会导致下游 conan install 找不到包。
推荐做法:
- 用
conan profile detect --name=mywin64-msvc193-release自动生成 profile,再手动检查compiler.runtime(dynamic还是static)是否匹配你的.lib链接方式 - 把 profile 文件提交进项目仓库,避免靠记忆手写
- 交叉编译场景下(如 aarch64-linux-gnu),profile 中
os_build和os_target要分开写,不能只靠detect
conan upload 前先 conan list 确认包存在且可解析
执行 conan export-pkg 后,包只在本地缓存,还没上传。容易忽略的是:上传前没验证包是否真能被 Conan 正确识别。
快速验证步骤:
- 运行
conan list "mylib/1.2.0@user/channel" --graph=mygraph.json,看输出是否含该引用及对应二进制 ID - 临时建个空目录,写个最小
conanfile.txt:[requires]\nmylib/1.2.0@user/channel\n[generators]\nCMakeDeps
,然后conan install . --profile=mywin64-msvc193-release—— 成功生成mylib-release-x86_64-data.cmake才算过关 -
conan upload时务必加--remote=my-internal-remote,别漏掉;私有远程需提前用conan remote add注册并conan user登录
CMakeLists.txt 里链接时别硬编码 find_package(mylib)
很多团队上传成功后,在 CMake 中直接写 find_package(mylib),结果报错 Could not find mylibConfig.cmake。这是因为 Conan 默认不生成标准 *Config.cmake,而是通过 CMakeDeps 生成 mylib-release-x86_64-data.cmake。
正确写法(CMakeLists.txt):
cmake_minimum_required(VERSION 3.23)\nproject(MyApp)\n\n# 必须先 include Conan 生成的依赖文件\ninclude(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)\ninclude(${CMAKE_BINARY_DIR}/mylib-release-x86_64-data.cmake)\n\nfind_package(mylib REQUIRED)\nadd_executable(app main.cpp)\ntarget_link_libraries(app PRIVATE mylib::mylib)
注意:target_link_libraries 必须用 mylib::mylib 这种命名空间形式,不是 mylib 单名——这是 CMakeDeps 生成器的约定,漏掉双冒号会导致链接失败。











