default_options必须显式声明所有options键且值合法,子依赖选项需在requirements()或configure()中设置,命令行覆盖需带包名前缀如mylib:shared=True。

默认 options 必须在 default_options 字典中显式声明,否则即使 options 里定义了可选值,也不会生效
conanfile.py 中 default_options 的写法必须匹配 options 结构
Conan 不会自动推断默认值。你定义了 options = {"shared": [True, False], "fPIC": [True, False]},就必须在 default_options 里把两个都写全,哪怕只打算改其中一个:
-
default_options的键名、大小写、嵌套层级必须和options完全一致 - 值必须是
options中声明的合法取值之一(比如不能写"shared": "yes") - 如果某个 option 是子包的(如
A:shared),它不属于当前包的default_options,得用configure()或依赖传递控制
正确示例:
from conan import ConanFile
<p>class MyLib(ConanFile):
name = "mylib"
version = "1.0"
options = {
"shared": [True, False],
"fPIC": [True, False],
"with_ssl": [True, False]
}
default_options = {
"shared": False,
"fPIC": True,
"with_ssl": True # 缺一不可
}设置子依赖的默认选项不能靠 default_options
比如你的包 B 依赖 A,想让 A 默认启用 shared=True,default_options = {"A:shared": True} 是无效的 —— Conan 1.x 和 2.x 都不支持这种写法。
- Conan 2.x 推荐在
requirements()中用self.requires("A/1.0", options={"shared": True}) - Conan 1.x 只能在
configure()方法里调用self.options["A"].shared = True - 直接写进
default_options会导致 Conan 启动时报错:Option 'A:shared' doesn't exist in 'B'
命令行覆盖 default_options 时的优先级和写法
用户执行 conan create . --options mylib:shared=True 时,这个值会覆盖 default_options;但注意语法细节:
- 必须带包名前缀:
mylib:shared=True,不能只写shared=True(除非在conanfile.txt的[options]段) - 多个选项用空格分隔:
--options mylib:shared=True mylib:fPIC=False - 如果包名含版本或用户通道(如
mylib/1.0@user/stable),前缀仍只需用name(即mylib)
常见错误:漏掉冒号、拼错包名、用等号连接多个选项(如 --options shared=True,fPIC=False)—— 这会导致解析失败,Conan 会静默忽略或报 unrecognized arguments。
真正容易被忽略的是:一旦你在 configure() 里动态修改了 self.options,它会覆盖 default_options 的初始值,且该修改发生在配置阶段早期,后续任何命令行传入的 --options 都是在这之后应用的 —— 所以顺序和时机比写法更关键。


















