在Qt c++中使用OpenSSL

Use OpenSSL in Qt C++

本文关键字:OpenSSL Qt c++      更新时间:2023-10-16

我得到了一个使用QSslSocketQSslCertificate从SSL证书(Qt 5.7, Windows 10)获取信息的示例项目。QSslSocket::supportsSsl()函数返回false,我在运行时得到这些错误:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

所以我编译了OpenSSL_1.1.0并将其链接到我的项目:

INCLUDEPATH += . "C:/OpenSSL-Win32/include/" LIBS +=
-L"C:/OpenSSL-Win32/lib/" -llibcrypto -llibssl

但是仍然有相同的错误。我下载了OpenSSL安装程序,还是一样。

奇怪的是QSslSocket::sslLibraryBuildVersionString()返回OpenSSL 1.0.2g 1 Mar 2016,即使我编译并安装了OpenSSL_1.1.0。

我知道我错过了一个简单的细节。请告诉我是什么。谢谢。

来自文档:

QSslSocket::sslLibraryBuildVersionString()返回编译时使用的SSL库的版本字符串。(强调我的)

你从它得到的结果并不意味着Qt可以访问OpenSSL,只是它是针对某个版本编译的。这让你知道,如果它是动态链接的(默认情况下是这样),你应该在运行时提供哪个二进制兼容的版本。

你想检查QSslSocket::sslLibraryVersionNumber() -[…]运行时使用的库的版本(强调我的)。

Qt可能会尝试在PATH中找到OpenSSL dll的副本,如果没有,则在QCoreApplication::libraryPaths给出的路径中找到。在尝试使用OpenSSL之前,您应该将OpenSSL dll的位置添加到其中一个。