QT_NO_SSL 和 QSslSocket::supportsSsl() 之间的关系

Relation between QT_NO_SSL and QSslSocket::supportsSsl()

有一个定义 QT_NO_SSL,如果没有找到 Ssl 库则定义它。 还有方法 QSslSocket::supportsSsl().

但这两者有什么关系,它们是等价的吗? QT_NO_SSL <=> QSslSocket::supportsSsl() returns false 成立还是可能 QT_NO_SSL 未定义,但 QSslSocket::supportsSsl() returns 错误?

可以编译 Qt(至少有 OpenSSL 后端):

  1. 没有 SSL 支持 -- QT_NO_SSL 已定义,SSL 类 甚至不可用于编译;
  2. 在运行时加载 SSL 支持 => OpenSSL headers 必须在编译时出现,但 QtNetwork 不会 link 到 libssl/libcrypto/。 ..;相反,它将 dlopen 这些库在运行时寻找它需要的函数;
  3. 支持 SSL link来自 QtNetwork。

这样做的原因与这样一个事实有关,即 link将 QtNetwork 转换为密码库会在美国重新分发 from/to 方面引发法律问题。对于#3,您必须 拥有 SSL 库,否则您的应用程序将无法启动,即使您根本不需要 SSL; Qt 安装程序无法 "easily" 提供这些 SSL 库。因此,Qt 在配置 #2 中编译, 有安装 OpenSSL 的责任。

未定义 QT_NO_SSLQSslSocket::supportsSsl() returns false 的场景是 #2(例如,如果 Qt 无法找到或加载合适的 SSL 库)。