如何在Conan项目中强制覆盖shared选项使其始终以静态模式编译
解决方案
核心思路
不要限制shared选项的可选值范围,而是在Conan的配置阶段强制覆盖shared选项的值为False,这样既不会触发外部传入参数的合法性报错,又能保证最终始终以静态模式构建。
具体实现
在你的Conan配方中添加configure方法,在方法内部强行指定shared选项为False:
from conans import ConanFile, CMake class MyLibConan(ConanFile): name = "mylib" version = "1.16.0" generators = "cmake" settings = "os", "arch", "compiler", "build_type" options = {"shared": [True, False]} default_options = "shared=False" exports_sources = ["*"] url = "some-url" license = "my license" description = "my library" def configure(self): # 强制覆盖shared选项,无论外部传入什么值都设为False self.options.shared = False def build(self): cmake = CMake(self) cmake.configure() cmake.build() def package(self): # do some copying here def package_info(self): self.cpp_info.includedirs = ['include'] self.cpp_info.libdirs = ['lib'] self.cpp_info.libs = ['mylib']
原理说明
- 保留
options中shared的可选值为[True, False],服务器脚本传入shared=True时会先通过Conan的参数合法性校验,不会直接报错 configure方法会在参数校验完成后、构建开始前执行,此时强行修改shared的值为False,后续所有构建逻辑都会按静态库模式运行- 不需要修改服务器端的执行脚本,对上游调用完全无感知
注意事项
请确保你的CMake构建脚本是跟随Conan的shared选项控制编译模式的,不要硬编码动态库编译逻辑。
内容的提问来源于stack exchange,提问作者Farahi
相关产品推荐
相关产品推荐

