Conan2:使用CMakeDeps后如何正常查找OpenSSL目标?
关于移除CMakeDeps时的FindOpenSSL来源
是的,移除CMakeDeps生成器后,CMake会默认使用系统路径(如你提到的/usr/share/cmake-3.16/Modules)下的FindOpenSSL.cmake模块。因为此时Conan不再生成自定义的查找模块,CMake会按照自身默认的模块搜索优先级,优先查找系统自带的Find模块。
让CMake使用CMakeDeps生成的FindOpenSSL.cmake的方法
以下是几个关键步骤:
优先设置模块搜索路径
在你的CMakeLists.txt中,将Conan生成的generators目录添加到CMAKE_MODULE_PATH的最前端,确保CMake优先搜索这里的模块。代码要放在find_package(OpenSSL REQUIRED)之前:list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_BINARY_DIR}/generators") find_package(OpenSSL REQUIRED)修正目标引用名称
CMakeDeps生成的OpenSSL目标名称通常是OpenSSL::SSL和OpenSSL::Crypto,而非你报错里的openssl:openssl。检查你的CMakeLists.txt,确保链接目标时使用正确的名称:target_link_libraries(你的目标名称 PRIVATE OpenSSL::SSL OpenSSL::Crypto)通过CMakeToolchain注入路径(可选)
如果你不想手动修改CMakeLists.txt,可以在Conan recipe的generate方法中,通过CMakeToolchain直接设置CMAKE_MODULE_PATH:def generate(self): toolchain = CMakeToolchain(self) toolchain.variables["CMAKE_MODULE_PATH"] = "${CMAKE_BINARY_DIR}/generators" toolchain.generate()这样Conan会自动将路径配置注入到CMake toolchain文件中,无需手动修改项目CMake代码。
验证生成文件完整性
检查构建目录下generators/FindOpenSSL.cmake的内容,确认文件里正确定义了OpenSSL_FOUND变量以及对应的OpenSSL::SSL/OpenSSL::Crypto目标。如果文件异常,可以尝试清理构建目录后重新执行conan install命令,重新生成模块文件。
内容的提问来源于stack exchange,提问作者Hans123

