如何修复 Conan CMake Could NOT find OpenSSL

问题:

构建 conan 包时,你看到此 CMake 错误:

cmake_findopenssl_error.txt
CMake Error at /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY
  OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.16/Modules/FindOpenSSL.cmake:447 (find_package_handle_standard_args)
  ../_deps/curl-src/CMakeLists.txt:365 (find_package)

即使你的 conanfile.py 声明 OpenSSL 为依赖项:

conanfile.py
class MyPackageConan(ConanFile):
  # ...
  requires = ("openssl/1.1.1l", )

解决方案

确保项目的 CMakeLists.txt 包含这些行:

CMakeLists_conan_setup.cmake
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

通常,这样做的方法是使用 conan new 自动生成的此代码:

conan_source_replace.py
  # 这个小技巧可能有助于保证正确的 /MT /MD 链接
  # 在 MSVC 中,如果打包的项目没有变量来设置它
  # 则可能有用
  tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)",
            '''PROJECT(HelloWorld)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''')

source() 中像这样:

conan_source.py
  def source(self):
    self.run("git clone https://github.com/conan-io/hello.git")
    # 这个小技巧可能有助于保证正确的 /MT /MD 链接
    # 在 MSVC 中,如果打包的项目没有变量来设置它
    # 则可能有用
    tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)",
                '''PROJECT(HelloWorld)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''')

注意你需要用正确的文件名替换 hello/CMakeLists.txt(通常只需将 hello 替换为)。此外,你需要用 CMakeLists.txt 中的实际行替换两个 PROJECT(HelloWorld) 实例,以便替换命令工作。


Check out similar posts by category: C/C++, CMake, Conan