How to fix Conan CMake "Could NOT find OpenSSL"
Problem:
When building your conan package, you see this CMake error:
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)
even though your conanfile.py
declares OpenSSL as a dependency:
class MyPackageConan(ConanFile):
# ...
requires = ("openssl/1.1.1l", )
Solution
Make sure that the project’s CMakeLists.txt
contains these lines:
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
Typically, the way to do this is to use this code which is automatically generated by conan new
:
# This small hack might be useful to guarantee proper /MT /MD linkage
# in MSVC if the packaged project doesn't have variables to set it
# properly
tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)",
'''PROJECT(HelloWorld)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''')
in source()
like this:
def source(self):
self.run("git clone https://github.com/conan-io/hello.git")
# This small hack might be useful to guarantee proper /MT /MD linkage
# in MSVC if the packaged project doesn't have variables to set it
# properly
tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)",
'''PROJECT(HelloWorld)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''')
Note that you need to replace both hello/CMakeLists.txt
with the correct filename (typically, just replace hello
by). Also, you need to replace both instances PROJECT(HelloWorld)
by the actual line from your CMakeLists.txt
in order for the replace command to work.