Conan默认不自动构建缺失依赖,因遵循“确定性优先”原则:只下载预编译二进制包以避免环境差异导致结果不一致;需显式指定--build=missing才从源码构建匹配当前settings/options的包。

Conan 默认不会自动构建缺失的依赖包,必须显式告诉它“缺的就编译”——关键就是 --build=missing 这个参数。
为什么 conan install 不自动编译?
Conan 的设计原则是“确定性优先”:它默认只下载预编译二进制包(binary),避免因本地环境差异导致构建结果不一致。如果你没加 --build 相关选项,遇到本地没有对应二进制时,会直接报错,例如:
ERROR: Missing prebuilt package for 'zlib/1.2.13'
这不是 bug,是预期行为。Conan 认为:你该明确决定要不要自己编译,而不是悄悄替你执行耗时操作。
--build=missing 是最常用且安全的选择
这个参数的意思是:“只要本地缓存里没有匹配当前 settings 和 options 的二进制包,就从源码构建”。它不会重复编译已有的包,也不会影响其他依赖的复用逻辑。
- 执行命令示例:
conan install . --build=missing -s compiler=gcc -s compiler.version=12 -s build_type=Release - 确保
-s设置和你最终 CMake 构建环境严格一致,否则即使构建了,CMake 也找不到对应配置的库 - 如果只想强制重编某个特定依赖(比如调试
openssl行为),可用:--build=openssl - 想彻底禁用二进制复用、全部源码编译?用
--build=*——但慎用,CI 构建时间会显著上升
常见踩坑点:构建了却链接失败
即使 --build=missing 成功跑完,CMake 仍可能报 Could not find OpenSSL 或类似错误。原因通常不是 Conan 没构建,而是:
-
CMakeLists.txt里没正确引入 Conan 生成的CMakeDeps文件,漏了include(${CMAKE_BINARY_DIR}/conan_deps.cmake) - 执行
conan install时没指定--output-folder=build,导致生成的.cmake文件不在 CMake 预期路径 - 依赖包本身不支持你的
compiler.libcxx(比如用了libstdc++11但包只编译了libstdc++) -
conanfile.txt或conanfile.py里漏写了[generators],或用了过时的cmake_find_package而不是CMakeDeps+CMakeToolchain
进阶:在 conanfile.py 里固化构建策略
如果你希望所有协作者都不用记命令参数,可以把构建逻辑写进配方里:
class MyProject(ConanFile):
settings = "os", "compiler", "build_type", "arch"
requires = "fmt/10.2.1", "openssl/3.0.10"
<pre class='brush:php;toolbar:false;'>def configure(self):
# 强制 openssl 总是源码构建(比如要打 patch)
self.options["openssl"].shared = True
self.conf["tools.build:skip_binary_validation"] = True
def layout(self):
cmake_layout(self)注意:conf 字段不能直接控制 --build 行为,但可通过 self.conf["tools.build:force_reinstall"] = True 触发重装(含重建),适合调试阶段;真正稳定的策略还是靠 CI 脚本统一传参。
最易被忽略的一点:Conan 构建缺失包时,会严格校验 profile 中的 compiler.version 和实际 GCC/Clang 版本是否完全匹配——差一个补丁号(如 12.3 vs 12.4)都算“missing”,得手动调整 profile 或升级 Conan 的 compiler detection。

















