我正在尝试安装一个使用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'

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

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

yum install openssl-devel

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

我也有同样的问题(openssl),这在Ubuntu 14.04.1 LTS上为我工作。解决方案在Ubuntu 18.04之前都是一样的(已测试)。

sudo apt-get install libssl-dev

修复它在macOS使用

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

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


你拥有的是FindOpenSSL。Cmake模块中的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)

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

Sudo DNF安装openssl-devel


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

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

这是我在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()

以防万一……这对我很有用。对不起,具体的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()

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

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

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


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

sudo apt install libssl-dev

但对我来说,这还不够,因为虽然安装了建筑所需的图书馆,但仍然找不到。除此之外,我还必须安装

sudo apt install pkg-config

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

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

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


在运行sudo apt install libssl-dev后,在WSL上我仍然得到了错误。

我必须运行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

除了被接受的答案,我还发布了一些额外的信息,这些信息可以节省我整整两天的工作和一个完整的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包的内容:

libssl-dev .文件列表

所以,在我的情况下,解决方案是使用这个cmake指令:

target_link_libraries(MyExecutable ssl crypto)


我使用macOS,我更喜欢设置环境变量OPENSSL_ROOT_DIR

brew install openssl@1.1
export OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1/