必须加 --build=missing 参数,否则 Conan 默认只下载不编译;若远程无预编译二进制(如 openssl/1.1.1w),不加该参数就会卡住不动。

远程仓库没二进制包,但 conan install 卡住不动
这是最常见现象:执行 conan install 后,日志停在 “Downloading xxx” 或直接报 ERROR: Missing prebuilt package for 'zlib/1.2.13',且没触发编译。根本原因不是网络问题,而是 Conan 默认不自动构建缺失二进制——它只下载,不编译,除非你明确告诉它“可以 build”。
解决方法很简单,加 --build=missing 参数:
-
conan install . --build=missing:本地没二进制就从源码构建 -
conan install . --build=missing -s compiler.version=12:确保 settings 匹配,否则即使有源码也找不到对应 profile - 如果只想为某几个包构建,用
--build=zlib --build=openssl,避免全量重编
注意:某些旧包(如 openssl/1.1.1w)在 center.conan.io 上只有源码 recipe,没预编译二进制;不加 --build=missing 就会卡死。
加了 --build=missing 还失败:找不到源码或编译报错
Conan 找不到源码,通常是因为 recipe 里没写 source() 或 exports_sources 不全;编译失败则多因依赖链中某个包的 configure()/build() 方法不兼容你的环境(比如用了 Windows-only 的命令、缺少 autotools)。
排查要点:
- 运行
conan search zlib/1.2.13@确认该版本 recipe 是否存在(末尾@表示默认 channel) - 用
conan get zlib/1.2.13@查看 recipe 源码,重点检查source()是否调用tools.get()或git.clone(),以及是否漏掉exports_sources = "CMakeLists.txt", "src/*" - 若编译失败,加
-v参数重试:conan install . --build=missing -v,看错误是否来自./configure缺失或cmake版本太低
典型陷阱:某些包(如老版 OpenCV)的 recipe 要求 cmake >= 3.16,而系统自带的是 3.10 —— 此时必须升级 cmake 或改用 container 构建。
不想编译,只想用已有二进制:怎么绕过远程查找?
你手头其实有编译好的 .so/.dll/.a 文件,但 Conan 坚持去远程找,又不愿开 --build。这时候得用 conan export-pkg 把本地二进制“塞进”本地缓存,让它被当成合法包消费。
操作分三步:
- 准备目录结构:
mylib/下放include/、lib/、bin/(Conan 强制约定) - 写一个极简
conanfile.py,只定义name、version,不用source/build,重点是package()里把文件拷对位置 - 执行:
conan export-pkg mylib/ mylib/1.0@user/stable -f conanfile.py
之后再在项目 conanfile.txt 里写 mylib/1.0@user/stable,conan install 就会直接取本地缓存,跳过远程。
为什么 conan search 显示有包,但 conan install 就是找不到二进制?
conan search 只查 recipe 是否存在,不查二进制;而 conan install 是按完整 ID 匹配二进制,这个 ID 由 settings + options 共同决定。哪怕只差一个 shared=True,ID 就完全不同。
验证方式:
- 运行
conan search zlib/1.2.13@ -r center,看返回里有没有linux_x86_64_gcc_12_release_shared_True这类字符串(取决于你的 profile) - 用
conan profile show default确认当前 profile 的compiler、build_type、os是否和远程二进制标签一致 - 如果 profile 是
compiler.libcxx=libstdc++11,但远程二进制只打了libc++,那它就是“不可见”的
最容易被忽略的一点:Conan 2.x 默认 profile 里 compiler.cppstd 是空的,但很多包要求显式指定(如 c++17),不写就会导致 ID 不匹配,看似有包,实则找不到。


















