CMake无法找到OpenSSL库

CMake无法找到OpenSSL库,openssl,cmake,Openssl,Cmake,我正在尝试安装一个使用cmake自行安装的软件。当我在命令行上运行cmake..时,它会在CMakeLists.txt中给出以下错误,该行显示find_package(需要OpenSSL): 以下是文件CMakeLists.txt中错误来源的部分: # # OpenSSL # if (WITH_SSL) message("Compiling with SSL support") if (USE_CYASSL) # Use CyaSSL as

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

以下是文件
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'

如果您可以使用pkg config
pkg\u search\u 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:

然后设置以下变量:

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(已测试)相同


在macOS上使用

brew install openssl
cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
@莫文是对的。 您需要配置openssl目录。 在此之前,您可能需要确保您拥有它。 你应该检查一下你是否有。 首先运行
openssl版本
,然后如果您有它,您可以
win+r
run
openssl
您可以找到core dir,因为它在您的系统中可能不命名为openssl


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

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


sudo dnf安装openssl-devel

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

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

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

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


# https://cmake.org/cmake/help/latest/command/find_package.html
#在上面的链接中,它指出:
#“在模块模式下,CMake搜索名为Find.CMake的文件。
#首先在CMAKE_模块_路径中搜索该文件,然后在查找中搜索
#CMake安装提供的模块。如果找到该文件,则
#由CMake读取和处理。它负责查找包裹,
#检查版本,并生成任何需要的消息。有些查找模块
#提供有限或不支持版本控制;请查看模块文档。“
#
#FindOpenSSL.cmake可以在路径/to/cmake/Modules中找到
#
# https://cmake.org/cmake/help/latest/module/FindOpenSSL.html
#
查找_包(需要OpenSSL)
如果(找到OPENSSL_)
#添加用于编译的include目录
目标目录(${PROJECT\u NAME}PUBLIC${OPENSSL\u include\u DIR})
#添加用于链接的静态库
目标链接库(${PROJECT\u NAME}OpenSSL::SSL OpenSSL::Crypto)
消息(状态“找到OpenSSL${OpenSSL_VERSION}”)
else()
消息(状态“未找到OpenSSL”)
endif()

以防万一……这对我很有用。对于特定版本的OpenSSL很抱歉,但可能需要

#在macOS上,在自制软件中搜索OpenSSL的keg-only版本
#相当于#-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/-DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
如果(CMAKE_主机_系统_名称与“Darwin”匹配)
执行程序(
命令brew——前缀OpenSSL
结果变量BREW\U OPENSSL
输出变量BREW\u OPENSSL\u前缀
输出\u条带\u尾随\u空格
)
if(BREW_OPENSSL等于0且存在“${BREW_OPENSSL_前缀}”)
消息(状态“在${BREW\u OpenSSL\u PREFIX}处发现由Homebrew安装的OpenSSL小桶”)
set(OPENSSL\u ROOT\u DIR“${BREW\u OPENSSL\u PREFIX}/”)
集合(OPENSSL_INCLUDE_DIR“${BREW_OPENSSL_PREFIX}/INCLUDE”)
集合(OPENSSL_库“${BREW_OPENSSL_前缀}/lib”)
集合(OPENSSL_加密_库“${BREW_OPENSSL_前缀}/lib/libcrypto.dylib”)
endif()
endif()
...
查找_包(需要OpenSSL)
如果(找到OPENSSL_)
#添加用于编译的include目录
目标目录(${target\u SERVER}PUBLIC${OPENSSL\u include\u DIR})
#添加用于链接的静态库
目标链接库(${target\u SERVER}OpenSSL::SSL OpenSSL::Crypto)
消息(状态“找到OpenSSL${OpenSSL_VERSION}”)
else()
消息(状态“未找到OpenSSL”)
endif()

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

要检查要安装的软件包,您可以做的另一件事是查找要安装的产品的手册或文档是否包含有关要安装的软件包的信息


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

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

     sudo apt install libssl-dev
但对我来说,这还不够,因为尽管已经安装了构建所需的库,但仍然找不到它们。我还需要安装的是

     sudo apt install pkg-config

很有魅力,谢谢!我能够从你提到的链接中提取下载的zip文件。在此之后,我刚刚添加了-DOPENSSL_ROOT-DIR=“C:/Path/To/Extracted/Files”。这已经非常过时,使用起来可能很危险。openssl网站有两个提供二进制文件的网站链接。这似乎是像这样的安全相关LIB的问题。但是,像这样设置值也应该适用于其他二进制下载。在Windows上使用
-DBUILD\u TESTING=OFF-DCMAKE\u USE\u OPENSSL=on
设置环境变量abov

# 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()
     sudo apt install libssl-dev
     sudo apt install pkg-config