【问题标题】:CMake not able to find OpenSSL libraryCMake 找不到 OpenSSL 库
【发布时间】:2013-04-21 08:32:40
【问题描述】:

我正在尝试安装一个使用 cmake 自行安装的软件。当我在命令行上运行cmake .. 时,它在CMakeLists.txt 上显示find_package(OpenSSL REQUIRED) 的行中出现以下错误:

-- 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)

这是文件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)

我在这里安装了 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

我在我的.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

我该如何解决这个错误?

编辑:

现在我收到此错误

/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'

【问题讨论】:

    标签: openssl cmake


    【解决方案1】:

    我遇到了同样的问题(openssl),这在 Ubuntu 14.04.1 LTS 上对我有用。该解决方案与 Ubuntu 18.04(已测试)相同。

    sudo apt-get install libssl-dev
    

    【讨论】:

    • 这应该是被接受的答案!感谢您的解决方案!
    • 同样适用于 Ubuntu 16.04 LTS。
    • 这个包在 Centos 7 上被称为openssl-devel,所以你可以使用sudo yum install openssl-devel
    • @Astrid 我能够让它在 Ubuntu 18.04 中运行
    • 同样适用于 Ubuntu 20.04 LTS
    【解决方案2】:

    使用 macOS 修复它

    brew install openssl
    cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
    

    【讨论】:

    【解决方案3】:

    如果您使用的是 Ubuntu,请运行 sudo apt install libssl-dev

    【讨论】:

    • @Astrid 对我来说效果很好。您收到什么错误消息?
    • 在 ubuntu 18.04 @Astrid 上也为我工作
    【解决方案4】:

    同样的问题,并在我的 centos 6.5 上使用以下命令修复了它。

    yum install openssl-devel
    

    【讨论】:

      【解决方案5】:

      请从以下链接安装 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
      

      【讨论】:

      • 像魅力一样工作,谢谢!我能够从您提到的链接中提取下载的 zip 文件。之后我刚刚添加了 -DOPENSSL_ROOT-DIR="C:/Path/To/Extracted/Files"。
      • 这已经过时了,使用起来可能很危险。 openssl 网站有两个提供二进制文件的网站的链接。这似乎是像这样与安全相关的库的问题。但是,设置这样的值也应该适用于其他二进制下载。
      • 使用-DBUILD_TESTING=OFF -DCMAKE_USE_OPENSSL=ON在Windows上工作
      • 设置上面的环境变量可以让 Cmake 成功完成,但是我得到了编译错误。但是我在slproweb.com/products/Win32OpenSSL.html 下载了 Win64 OpenSSL v1.1.1k 库,这些库更新了,然后它工作了,谢谢!。我还将环境变量 OPENSSL_CONF 设置为指向 openssl.cfg
      【解决方案6】:

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

      【讨论】:

      • 您可能可以提供有关您找到的解决方案的更多详细信息
      【解决方案7】:

      如果您可以使用 pkg-configpkg_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})
      

      【讨论】:

        【解决方案8】:

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

        cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
        

        【讨论】:

        • 我认为 OPENSSL_CRYPTO_LIBRARY 应该指向 /usr/local/opt/openssl/lib/libcrypto.dylib 。
        【解决方案9】:

        以防万一……这对我有用。对于特定版本的 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()
        

        【讨论】:

          【解决方案10】:

          您在 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)
          

          【讨论】:

          • 用 OPENSSL_INCLUDE_DIR 替换 OPENSSL_INCLUDE_DIRS 后,工作正常。 win10 + vs2019 + cmake 3.20.3 + slproweb.com(Win32OpenSSL-1_1_1k.exe)
          【解决方案11】:

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

          sudo dnf install openssl-devel

          【讨论】:

            【解决方案12】:

            正如其他人所说,你应该在 Ubuntu 上运行

                 sudo apt install libssl-dev
            

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

                 sudo apt install pkg-config
            

            【讨论】:

              【解决方案13】:

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

              brew upgrade openssl
              brew link --force openssl
              pkg-config --modversion openssl
              #1.1.1l
              

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

              【讨论】:

                【解决方案14】:

                @Morwenn 是对的。 您需要配置 openssl DIR。 在此之前,您可能需要确保拥有它。 你应该检查你是否拥有它。 首先运行openssl version,然后如果你有它,你可以win + r运行openssl 你会找到核心目录,因为它在你的系统中可能没有命名为 openssl。

                【讨论】:

                  【解决方案15】:

                  这是我在CMakeList.txt 中添加的(有效):

                  
                  # https://cmake.org/cmake/help/latest/command/find_package.html
                  # in the above link, it states:
                  # "In Module mode, CMake searches for a file called Find<PackageName>.cmake. 
                  #  The file is first searched in the CMAKE_MODULE_PATH, then among the Find 
                  #  Modules provided by the CMake installation. If the file is found, it is
                  #  read and processed by CMake. It is responsible for finding the package,
                  #  checking the version, and producing any needed messages. Some find-modules
                  #  provide limited or no support for versioning; check the module documentation."
                  #
                  # FindOpenSSL.cmake can be found in path/to/cmake/Modules
                  #
                  # https://cmake.org/cmake/help/latest/module/FindOpenSSL.html
                  #
                  
                  find_package(OpenSSL REQUIRED)
                  if (OPENSSL_FOUND)
                    # Add the include directories for compiling
                    target_include_directories(${PROJECT_NAME} PUBLIC ${OPENSSL_INCLUDE_DIR})
                  
                    # Add the static lib for linking
                    target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto)
                  
                    message(STATUS "Found OpenSSL ${OPENSSL_VERSION}")
                  
                  else()
                  
                    message(STATUS "OpenSSL Not Found")
                  
                  endif()
                  

                  【讨论】:

                    【解决方案16】:

                    在 WSL 上运行 sudo apt install libssl-dev 后仍然出现错误。

                    我必须运行whereis openssl,然后更新CMakeCache.txt 中注释掉的行:

                    #OPENSSL_CRYPTO_LIBRARY:FILEPATH=OPENSSL_CRYPTO_LIBRARY-NOTFOUND
                    OPENSSL_CRYPTO_LIBRARY:FILEPATH=/usr/bin/openssl
                    
                    #OPENSSL_INCLUDE_DIR:PATH=OPENSSL_INCLUDE_DIR-NOTFOUND
                    OPENSSL_INCLUDE_DIR:PATH=/usr/include/openssl
                    

                    【讨论】:

                      【解决方案17】:

                      答案实际上取决于您的系统状态和您正在使用cmake 的程序。根据您遇到的第二个错误,您可能需要一个额外的 openssl 软件包,该软件包当前未安装在您的系统上。您可以使用aptitude search 命令搜索包。我建议搜索“ssl”而不是“openssl”,因为包有时不包含“open”一词。

                      检查要安装哪些软件包的另一件事是查看您正在安装的产品的手册或文档是否包含有关要安装哪些软件包的信息。

                      与其他帖子评论一样,其中一个包是 libssl-dev,但您的程序可能还需要一些其他包。

                      【讨论】:

                        【解决方案18】:

                        除了接受的答案之外,我还发布了一些额外的信息,这些信息可以节省我两天的工作时间和完整的 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-file list libssl-dev

                        所以,就我而言,解决方案是改用这个 cmake 指令:

                        target_link_libraries(MyExecutable ssl crypto)

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-10-23
                          • 2020-10-17
                          • 2017-09-25
                          • 2014-10-30
                          • 2018-09-12
                          • 1970-01-01
                          相关资源
                          最近更新 更多