CMake无法找到OpenSSL库

All*_*lan 76 openssl cmake

我正在尝试安装一个软件,它使用cmake来安装自己,当我在commandlin cmake上给它时..
它在这个文件中给出了以下错误,CMakeLists.txt -------- line ---> find_package(需要OpenSSL): -

 cmake ..
-- Could NOT find Git (missing:  GIT_EXECUTABLE) 
ZLib include dirs: /usr/include
ZLib libraries: /usr/lib/arm-linux-gnueabihf/libz.so
Compiling with SSL support
CMake Error at /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
  OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/share/cmake-2.8/Modules/FindOpenSSL.cmake:313 (find_package_handle_standard_args)
  CMakeLists.txt:436 (find_package)
Run Code Online (Sandbox Code Playgroud)

这是文件CMakeLists.txt的一部分,其中出现错误:------

#
# OpenSSL
#
if (WITH_SSL)
    message("Compiling with SSL support")

    if (USE_CYASSL)
        # Use CyaSSL as OpenSSL replacement.
        # TODO: Add a find_package command for this also.
        message("CyaSSL include dir: ${CYASSL_INCLUDE_DIRS}")
        message("CyaSSL libraries: ${CYASSL_LIB}")

        # Additional to the root directory we need to include
        # the cyassl/ subdirectory which contains the OpenSSL
        # compatability layer headers.
        foreach(inc ${CYASSL_INCLUDE_DIRS})
            include_directories(${inc} ${inc}/cyassl)
        endforeach()

        list(APPEND LIB_LIST ${CYASSL_LIB})
    else()
        # TODO: Add support for STATIC also.
        find_package(OpenSSL REQUIRED)

        message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}")
        message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")

        include_directories(${OPENSSL_INCLUDE_DIR})
        list(APPEND LIB_LIST ${OPENSSL_LIBRARIES})
    endif()
endif(WITH_SSL)
Run Code Online (Sandbox Code Playgroud)

http://www.opensource.apple.com/source/OpenSSL/OpenSSL-7.1/openssl/INSTALL?txt
现在我已经安装了Openssl,这里:----

ssl header is here   -- > /usr/local/ssl/include/openssl/
ssl library is here  -- > /usr/local/ssl/lib/libssl.a
                          /usr/local/ssl/lib/libcrypto.a
openssl is here      -- > /usr/local/ssl/bin
Run Code Online (Sandbox Code Playgroud)

我把我的.profile设置为:----

export LD_LIBRARY_PATH=/usr/local/ssl/include/openssl:/usr/lib:/usr/local/lib:/usr/lib/pkgconfig:/usr/local/include/wx-2.8/wx:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
export OPENSSL_ROOT_DIR=/usr/local/ssl
export OPENSSL_LIBRARIES=/usr/local/ssl/lib/

PATH = /usr/local/ssl/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

如何解决此错误?

编辑: -
获取此错误

/usr/local/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x10): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x24): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x30): undefined reference to `dlclose'
Run Code Online (Sandbox Code Playgroud)

小智 177

我有同样的问题(openssl),这对我在Ubuntu 14.04.1 LTS上工作

sudo apt-get install libssl-dev
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案!谢谢你的解决方案 (11认同)
  • @Astrid我能够让它在Ubuntu 18.04中工作 (8认同)
  • 这个包在Centos 7上被称为`openssl-devel`,所以你会做`sudo yum install openssl-devel` (6认同)
  • 也适用于 Ubuntu 16.04 LTS。 (3认同)
  • 也适用于 Ubuntu 20.04 LTS (3认同)
  • 这不再起作用了;至少不在 Ubuntu 18.04 上。 (2认同)

Mor*_*enn 61

这是一个常见的误解:CMake不需要环境变量来知道库和包含dir的位置只是CMake变量.

由于CMake无法找到您的OpenSSL lib和include目录,因此在调用它时,您必须手动告诉他们命令行的位置.使用该选项-D从命令行在CMake中设置常量.您将需要设置常量OPENSSL_ROOT_DIR,OPENSSL_LIBRARIES因为它们是触发错误的常量.

cmake -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib
Run Code Online (Sandbox Code Playgroud)


qin*_*qin 24

用mac修复它在macOS上

brew install openssl
cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
Run Code Online (Sandbox Code Playgroud)

  • `OPENSSL_LIBRARIES` 是一个输出变量,而不是一个输入变量。见 https://github.com/Kitware/CMake/blob/300979e7889b34d61803675c560fe450c7404447/Modules/FindOpenSSL.cmake (3认同)
  • 专业提示:这是使用 `-D${Variiable name}` ,因为在这个答案中会导致 cmake 缓存该值,因此您只需在项目中一次在命令行中使用这些变量调用一次 `cmake` 即可。此后的每个构建都将使用缓存的值,因此您不必每次都将其添加到 cmake (除非您删除构建目录) (2认同)

Shr*_*n40 22

如果您使用的是 macOS,请按照以下步骤操作。

brew upgrade openssl
brew link --force openssl
pkg-config --modversion openssl
#1.1.1l
Run Code Online (Sandbox Code Playgroud)

清除cmakebuild文件夹并重新运行cmake ..

  • 我今天遇到了这个问题,这个解决方案对我有用。配置参考:在 Apple Silicon 上运行的 macOS Monterey。 (2认同)

rya*_*ung 20

如果您正在使用Ubuntu,请运行sudo apt install libssl-dev.

  • @Astrid,它对我来说效果很好。您收到什么错误消息? (4认同)

小智 20

正如其他人提到的,在 Ubuntu 上你应该运行

sudo apt install libssl-dev
Run Code Online (Sandbox Code Playgroud)

但对我来说这还不够,因为虽然安装了构建所需的库,但仍然找不到它们。我还必须安装的是

sudo apt install pkg-config
Run Code Online (Sandbox Code Playgroud)


app*_*apu 18

请从以下链接安装openssl:
https://code.google.com/p/openssl-for-windows/downloads/list
然后设置以下变量:

OPENSSL_ROOT_DIR=D:/softwares/visualStudio/openssl-0.9.8k_WIN32
OPENSSL_INCLUDE_DIR=D:/softwares/visualStudio/openssl-0.9.8k_WIN32/include
OPENSSL_LIBRARIES=D:/softwares/visualStudio/openssl-0.9.8k_WIN32/lib
Run Code Online (Sandbox Code Playgroud)

  • 现在这已经过时了,使用起来可能很危险.openssl网站链接到2个提供二进制文件的站点.这似乎是安全相关的lib这样的问题.但是,设置这样的值也应该与其他二进制下载一起使用. (2认同)
  • 设置上面的环境变量允许 Cmake 成功完成,但随后出现编译错误。不过,我在 https://slproweb.com/products/Win32OpenSSL.html 下载了 Win64 OpenSSL v1.1.1k 库,它是最新的,然后它就可以工作了,谢谢!我还设置环境变量 OPENSSL_CONF 指向 openssl.cfg (2认同)

小智 12

sudo apt install libssl-dev 适用于 ubuntu 18.04。

  • 您可能可以提供有关您找到的解决方案的更多详细信息 (2认同)

oll*_*llo 9

如果你可以使用pkg-config:pkg_search_module()可以找到OpenSSL.

# Search OpenSSL
find_package(PkgConfig REQUIRED)
pkg_search_module(OPENSSL REQUIRED openssl)

if( OPENSSL_FOUND )
    include_directories(${OPENSSL_INCLUDE_DIRS})
    message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
else()
    # Error; with REQUIRED, pkg_search_module() will throw an error by it's own
endif()

target_link_libraries(${YOUR_TARGET_HERE} ${OPENSSL_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)


小智 9

同样的问题,并使用以下命令将其修复到我的centos 6.5上.

yum install openssl-devel
Run Code Online (Sandbox Code Playgroud)


use*_*267 7

只是为了好玩,为 OP 的问题发布了一个替代的工作答案:

cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
Run Code Online (Sandbox Code Playgroud)

  • 我认为 OPENSSL_CRYPTO_LIBRARY 应该指向 /usr/local/opt/openssl/lib/libcrypto.dylib 。 (2认同)

OSP*_*OSP 7

以防万一...这对我有用。抱歉,对于 OpenSSL 的特定版本,但可能是可取的。

# On macOS, search Homebrew for keg-only versions of OpenSSL
# equivalent of # -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
    execute_process(
        COMMAND brew --prefix OpenSSL 
        RESULT_VARIABLE BREW_OPENSSL
        OUTPUT_VARIABLE BREW_OPENSSL_PREFIX
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    if (BREW_OPENSSL EQUAL 0 AND EXISTS "${BREW_OPENSSL_PREFIX}")
        message(STATUS "Found OpenSSL keg installed by Homebrew at ${BREW_OPENSSL_PREFIX}")
        set(OPENSSL_ROOT_DIR "${BREW_OPENSSL_PREFIX}/")
        set(OPENSSL_INCLUDE_DIR "${BREW_OPENSSL_PREFIX}/include")
        set(OPENSSL_LIBRARIES "${BREW_OPENSSL_PREFIX}/lib")
        set(OPENSSL_CRYPTO_LIBRARY "${BREW_OPENSSL_PREFIX}/lib/libcrypto.dylib")
    endif()
endif()

...

find_package(OpenSSL REQUIRED)
if (OPENSSL_FOUND)
  # Add the include directories for compiling
  target_include_directories(${TARGET_SERVER} PUBLIC ${OPENSSL_INCLUDE_DIR})
  # Add the static lib for linking
  target_link_libraries(${TARGET_SERVER} OpenSSL::SSL OpenSSL::Crypto)
  message(STATUS "Found OpenSSL ${OPENSSL_VERSION}")
else()
  message(STATUS "OpenSSL Not Found")
endif()
Run Code Online (Sandbox Code Playgroud)


sek*_*har 5

你在 cmake 模块中有 FindOpenSSL.cmake 文件(路径 usr/shared.cmake-3.5/modules)#搜索 OpenSSL

 find_package(OpenSSL REQUIRED) 
if( OpenSSL_FOUND )
    include_directories(${OPENSSL_INCLUDE_DIRS})
    link_directories(${OPENSSL_LIBRARIES})
    message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")

target_link_libraries(project_name /path/of/libssl.so /path/of/libcrypto.so)
Run Code Online (Sandbox Code Playgroud)


tta*_*ski 5

Fedora 27 用户注意事项:我必须安装openssl-devel软件包才能cmake成功运行。

sudo dnf install openssl-devel


小智 5

除了已接受的答案之外,我还发布了一些额外的信息,这些信息可以节省我整整两天的工作和完整的 CMake 撕裂。我的机器运行 Ubuntu 20.04

按照建议安装 libssl-dev 包括两个库:libssl 和 libcrypto。我的 cmake 项目中的 find_package 指令消除了项目中的引用错误,但它仍然找不到库。这是因为所有接受的答案都告诉您使用这些行:

find_package(需要 OpenSSL)

target_link_libraries(MyExecutable OpenSSL Crypto)

Cmake 将查找名为 libOpenSSL 和 libCrypto 的库。两者都因大写而失败,并且 libopenssl 不存在,因为该文件实际上只是命名为 libssl。事实上,可以使用以下命令检查 libssl-dev 包的内容:

apt 文件列表 libssl-dev

因此,就我而言,解决方案是使用此 cmake 指令:

target_link_libraries(MyExecutable ssl 加密