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 crypto
和 ssl
库并将其链接到项目Target。SSL
组件明确指定,以确保如果未找到 ssl
库,则查找模块会报告错误。
find_package(OpenSSL COMPONENTS SSL)
target_link_libraries(project_target PRIVATE OpenSSL::SSL)