制作Conan包时如何让CMake的find_package找到Conan提供的openssl?
实现方案
你可以通过Conan官方的CMake集成工具链来实现,具体操作步骤如下:
首先在Conan配方中添加CMake相关生成器
如果你使用的是Conan 2.x,直接在conanfile.py中声明两个生成器即可:from conan import ConanFile class YourProjectRecipe(ConanFile): # 其他配置如name、version、settings等 generators = ["CMakeToolchain", "CMakeDeps"] def requirements(self): self.requires("openssl/[>=1.1.1 <4]") # 如果你的项目中find_package用的是全小写的openssl,添加下面一行配置 self.requires["openssl"].set_property("cmake_find_package_name", "openssl")CMakeDeps会自动为所有声明的依赖生成对应的CMake Config配置文件,CMakeToolchain会生成适配Conan依赖路径的工具链文件,完美匹配项目中find_package的查找逻辑。在Conan配方的构建阶段使用官方CMake helper调用构建
直接用Conan封装好的CMake工具即可自动传入工具链参数,不需要手动修改项目的CMake代码:from conan.tools.cmake import CMake # 在你的ConanFile类中添加build方法 def build(self): cmake = CMake(self) cmake.configure() cmake.build()本地手动测试构建的特殊处理
如果你需要脱离Conan直接手动运行CMake测试项目构建,只需要在configure阶段传入Conan生成的工具链文件即可:cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=./build/conan_toolchain.cmake
常见问题排查
如果仍然提示找不到openssl,优先检查两个点:
- 确认你的项目中
find_package的openssl大小写是否和Conan生成的配置文件名匹配,如果你没有修改cmake_find_package_name属性,默认生成的是首字母大写的OpenSSL配置,对应find_package(OpenSSL REQUIRED) - 如果项目源码中自带了
FindOpenSSL.cmake模块,会优先走Module模式查找系统openssl,你可以在CMake配置时添加参数-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON,强制优先使用Conan生成的Config配置文件。
内容的提问来源于stack exchange,提问作者philtherobot
相关产品推荐
相关产品推荐

