【问题标题】:cmake can not find openssl on windowscmake在windows上找不到openssl
【发布时间】:2017-09-25 13:21:38
【问题描述】:

我已经阅读了这篇文章,但它没有回答我的问题:(cmake not able to find openssl)

我在 Windows 10 64 位上工作,我想使用支持 ssl 的 boost asio,所以我在 C:\Local\OpenSSL-Win64 中安装了 openssl,我有一个指向这个的环境变量。

我在 cmake 中有这段代码:

file(TO_CMAKE_PATH $ENV{OPENSSL_ROOT} OPENSSL_ROOT_DIR)
message(WARNING "root: ${OPENSSL_ROOT_DIR}")
find_package(OpenSSL )

message(WARNING "OpenSSL_VERSION: ${OPENSSL_VERSION}")
message(WARNING "OpenSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
message(WARNING "OpenSSL_LIBRARIES: ${OPENSSL_LIBRARIES}")

当我运行 cmake 时,我收到以下消息:

CMake Warning at CMakeLists.txt:44 (message):
  root: C:/Local/OpenSSL-Win64


CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.1/Modules/FindOpenSSL.cmake:293 (list):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:45 (find_package)


CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.1/Modules/FindOpenSSL.cmake:294 (list):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:45 (find_package)


CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.1/Modules/FindOpenSSL.cmake:296 (list):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:45 (find_package)


CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.1/Modules/FindOpenSSL.cmake:298 (list):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:45 (find_package)


Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing:  OPENSSL_LIBRARIES) (found version ".0.0`")
CMake Warning at CMakeLists.txt:47 (message):
  OpenSSL_VERSION: .0.0`


CMake Warning at CMakeLists.txt:48 (message):
  OpenSSL_INCLUDE_DIR: C:/Local/OpenSSL-Win64/include


CMake Warning at CMakeLists.txt:49 (message):
  OpenSSL_LIBRARIES: SSL_EAY_LIBRARY-NOTFOUND;LIB_EAY_LIBRARY-NOTFOUND

可以看出,cmake 可以找到正确指向 C:/Local/OpenSSL-Win64 的环境变量

另外有趣的是,它可以找到包含路径:

CMake Warning at CMakeLists.txt:48 (message):
OpenSSL_INCLUDE_DIR: C:/Local/OpenSSL-Win64/include

但是版本和包含库不对。

是否有任何特定的方法可以强制 cmake 找到 openssl?

如何确保它找到合适的静态库?

编辑 1

升级到 cmake 3.8 后,现在 cmake 可以找到 openssl,但不能找到它的库。输出如下:

Found OpenSSL: C:/Local/OpenSSL-Win64/lib/libssl.lib (found version "1.1.0e") 
CMake Warning at CMakeLists.txt:52 (message):
  OpenSSL_VERSION: 1.1.0e


CMake Warning at CMakeLists.txt:53 (message):
  OpenSSL_INCLUDE_DIR: C:/Local/OpenSSL-Win64/include


CMake Warning at CMakeLists.txt:54 (message):
  OpenSSL_LIBRARIES:

为什么找不到库?

编辑 2

找不到库的原因是我使用了不同大小写的变量名。正确的名称是 OPENSSL_LIBRARIES。

有关更多信息,请阅读作为 cmake 分发的一部分的 findopenssl.cmake 文件。

【问题讨论】:

  • 您有什么版本的 OpenSSL 以及您使用的是什么版本的 CMake?较新的 OpenSSL 版本更改了如何在其标头中指定版本号的格式,并且需要在 CMake 中进行相应的更改来解决这一问题。也许尝试最新的 CMake 版本(当前为 3.8.0),看看是否能解决您的问题。如果是的话,我会把这个评论变成你的答案。
  • @CraigScott 它帮助很大,但并没有完全解决问题。请参阅我更新的问题。
  • @CraigScott 现在我设法解决了这个问题。我在 library 上混合了案例。请将您的评论转为回答,我会接受。

标签: c++ boost cmake openssl


【解决方案1】:

最近的 OpenSSL 版本(我认为是 1.1.x 系列)略微更改了在 opensslv.h 标头中指定版本号的格式。这导致 CMake 在其 FindOpenSSL.cmake 模块中的版本解析代码失败,然后在 CMake 3.5.0 周围修复。此外,从 OpenSSL 1.1.0 开始,Windows 上的库名称更接近 Unix 对应的库名称,并被命名为 libcrypto 和 libssl(可能带有更多后缀),而不是旧名称 libeay32 和 ssleay32。 CMake 3.7.0 包含更新以解决此库名称更改。由于这两个更改和修复,如果您想在 CMake 项目中使用 OpenSSL 1.1.0 或更高版本,您可能应该使用 CMake 3.7.0 或更高版本。

【讨论】:

    【解决方案2】:

    我们在使用 cmake 2.8.12.2 和 OpenSSL 1.0.2u 时遇到了类似的问题

    CMake Error at /usr/share/cmake/Modules/FindOpenSSL.cmake:278 (list):
      list GET given empty list
    Call Stack (most recent call first):
      CMakeLists.txt:169 (FIND_PACKAGE)
    

    要了解更多详细信息,您可以在 cmake 命令中添加“--debug-output”选项。

    在我们的例子中,它有助于在 cmake 命令行上指定 -D_OPENSSL_VERSION:

    OPENSSL_VER=1.0.2u
    
    cmake ...
      -DOPENSSL_ROOT_DIR=$IDIR_BASE \
      -DOPENSSL_INCLUDE_DIR=$IDIR_BASE/include \
      -D_OPENSSL_VERSION="$OPENSSL_VER" \
    

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 2020-10-17
      • 2013-04-21
      • 1970-01-01
      • 2017-12-07
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多