FindOpenSSL

查找已安装的 OpenSSL 加密库并确定其版本。

3.20 版本新增: 支持在调用 find_package() 命令时指定版本范围。当请求版本时,可以像以前一样指定单个值,现在也可以使用版本范围。有关版本范围使用和功能的详细说明,请参阅 find_package() 命令。

3.18 版本新增: 支持 OpenSSL 3.0。

组件

此模块支持以下可选组件

Crypto

3.12 版本新增。

确保找到 OpenSSL crypto 库。

SSL

3.12 版本新增。

确保找到 OpenSSL ssl 库。

组件可以使用标准语法可选指定

find_package(OpenSSL [COMPONENTS <components>...])

如果没有请求任何组件,模块默认将 Crypto 作为必需组件,SSL 作为可选组件进行搜索。

导入的目标

此模块提供以下 导入目标

OpenSSL::Crypto

3.4 版本新增。

封装 OpenSSL crypto 库使用要求的Target,仅当找到 crypto 库时才可用。

OpenSSL::SSL

3.4 版本新增。

封装 OpenSSL ssl 库使用要求的Target,仅当找到 ssl 库时才可用。为方便起见,此Target还会链接 OpenSSL::Crypto,因为 ssl 库依赖于 crypto 库。

OpenSSL::applink

在 3.18 版本中新增。

封装 OpenSSL 应用程序端接口 (openssl/applink.c) 使用要求的Target,仅当找到 OpenSSL 且其版本至少为 0.9.8 时才可用。

此接口提供了 OpenSSL BIO 层和 Windows 编译器运行时环境之间的粘合,在使用 MSVC 时可能需要编译到项目中。通过链接此Target,即使项目使用不同的 MSVC 运行时配置,也可以链接其他 OpenSSL 导入的Target。在 MSVC 以外的平台上链接此Target没有效果。

注意

接口文件使用 INTERFACE_SOURCES Target属性添加。由于接口源在 CMake 中的传播方式,建议将 OpenSSL::applink Target链接为 PRIVATE,以确保它在任何库或可执行文件的整个依赖图中只链接一次

target_link_libraries(project_target PRIVATE OpenSSL::applink)

为此Target使用其他作用域可能会在构建或链接过程中导致意外问题,因为 ISO C 和 ISO C++ 标准对链接行为的要求很少。

结果变量

此模块定义了以下变量

OpenSSL_FOUND

布尔值,指示是否找到了 OpenSSL 库。为了向后兼容,OPENSSL_FOUND 变量也设置为相同的值。

OPENSSL_INCLUDE_DIR

OpenSSL 包含目录。

OPENSSL_CRYPTO_LIBRARY

OpenSSL crypto 库。

OPENSSL_CRYPTO_LIBRARIES

OpenSSL crypto 库及其依赖项。

OPENSSL_SSL_LIBRARY

OpenSSL ssl 库。

OPENSSL_SSL_LIBRARIES

OpenSSL ssl 库及其依赖项。

OPENSSL_LIBRARIES

所有 OpenSSL 库及其依赖项。

OPENSSL_VERSION

找到的 OpenSSL 版本。这被设置为 <major>.<minor>.<revision><patch> (例如 0.9.8s)。

OPENSSL_APPLINK_SOURCE

上述Target OpenSSL::applink 中的源。此变量仅在找到的 OpenSSL 版本至少为 0.9.8 且平台为 MSVC 时才定义。

提示

此模块接受以下变量来控制搜索行为

OPENSSL_ROOT_DIR

设置为 OpenSSL 安装的根目录,以便在自定义位置搜索 OpenSSL 库。

OPENSSL_USE_STATIC_LIBS

3.4 版本新增。

设置为 TRUE 以优先使用静态 OpenSSL 库而不是共享库。

OPENSSL_MSVC_STATIC_RT

3.5 版本新增。

设置为 TRUE 以搜索使用 MSVC 静态运行时 (MT) 构建的 OpenSSL 库。

ENV{PKG_CONFIG_PATH}

在类 UNIX 系统上,使用 pkg-config 定位 OpenSSL。设置 PKG_CONFIG_PATH 环境变量以指定备用位置,这在有多个库安装的系统上很有用。

示例

查找 OpenSSL crypto 库并将其链接到项目Target

find_package(OpenSSL)
target_link_libraries(project_target PRIVATE OpenSSL::Crypto)

以下示例展示了如何查找 OpenSSL cryptossl 库并将其链接到项目Target。SSL 组件明确指定,以确保如果未找到 ssl 库,则查找模块会报告错误。

find_package(OpenSSL COMPONENTS SSL)
target_link_libraries(project_target PRIVATE OpenSSL::SSL)