CMake在Windows上找不到OpenSSL

4

我已经阅读了这篇文章,但它没有回答我的问题: (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),看看是否可以解决您的问题。如果可以,我会将此评论转换为答案。 - Craig Scott
@CraigScott 非常有帮助,但并没有完全解决问题。请查看我的更新问题。 - mans
@CraigScott 现在我已经成功解决了这个问题。 我在库中混合了大小写。请将您的评论转换为答案,我会接受它。 - mans
2个回答

4

较新的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或更高版本。


1

我们在使用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”选项。

在我们的情况下,指定了-D_OPENSSL_VERSION参数有助于在cmake命令行上执行此操作:

OPENSSL_VER=1.0.2u

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接