conan install . --build=missing 是 conan 安装依赖并按需构建缺失二进制的标准命令,它基于 settings 和 options 计算 package id,仅对不匹配或不存在的包触发源码构建;加 -v 可查看 [cached]、[remote]、[outdated]、[missing] 等状态标识。

conan install --build=missing 是最直接的方式
Conan 默认不会自动构建缺失的二进制包,必须显式告诉它“只构建当前环境没有的”。conan install . --build=missing 就是标准做法——它会检查本地缓存 + 远程仓库中是否存在匹配当前 settings(如 compiler.version=12、os=Linux、arch=x86_64)和 options(如 shared=True)的二进制,仅对不匹配或完全不存在的包触发源码构建。
为什么 --build=missing 有时仍会全量重编?
常见原因是 settings 或 options 实际发生了隐式变化,导致 Conan 认为“所有包都不匹配”。典型诱因包括:
- profile 文件被修改但未重新指定(比如改了
compiler.cppstd=17却没加--profile=default) - 命令中漏传关键 setting,例如在 macOS 上没声明
compiler=apple-clang,Conan 可能 fallback 到默认值,ID 不一致 - 依赖自身 recipe 中用了
self.info.clear()或package_id()逻辑错误,使不同配置生成了相同 package ID,Conan 误判为“已有” - 远程仓库返回了部分二进制,但 ABI 不兼容(比如 OpenSSL 用 libc++ 编译,而你的项目用 libstdc++),Conan 无法识别这种不兼容,仍认为“存在”,结果链接失败
如何确认哪些包真被跳过、哪些被构建了?
加 -v 参数看详细日志:conan install . --build=missing -v。重点关注每条依赖行末的标记:
-
[cached]:本地缓存中已存在匹配二进制,直接复用 -
[remote]:从远程下载了预编译二进制 -
[outdated]:缓存中二进制过期(recipe 或版本变动),将重建 -
[missing]:完全找不到匹配项,进入 build 流程
注意:[missing] 不等于“一定从源码编译”——如果该包在远程有对应二进制但你没连上仓库,也会显示 missing;此时应检查 conan remote list 和网络连通性。
想更精细控制,避免误建某个特定包?
用 --build 指定白名单或黑名单:
-
--build=missing(默认行为,安全) -
--build=zlib:只构建 zlib,其余全走缓存/远程 -
--build=never:完全禁用构建,缺啥报错啥 -
--build=missing --build=boost:优先 missing,但 boost 强制构建(覆盖 missing 逻辑)
真正容易被忽略的是:Conan 的“缺失判断”完全基于 package ID,而 ID 由 settings + options + requires 共同决定。哪怕只改了一个 option(比如把 fPIC=False 改成 True),整个 ID 就变,之前缓存的二进制就作废——这不是 bug,是设计使然,也是 ABI 安全的前提。











