您运行 C:\Qt\MaintenanceTool.exe 来安装 Developer 和 Designer
工具 > OpenSSL 1.1.1d 工具包
这也是我的建议。另一种方法是自己编译 OpenSSL,或者下载二进制包来自第三方提供商。我已经安装了其中一个软件包"C:\Program Files\OpenSSL-Win64\bin"
,以及使用的程序Qt+=network
当库的路径包含在 PATH 环境变量中时,能够找到并加载库。问题是您需要自己处理更新,但 Qt 包会使用 MaintenanceTool 以及 Qt 和 Qt Creator 自动更新。所以选择你的选择。
无论如何,即使您的路径中有另一组 OpenSSL DLL,如果您将这些库复制到可执行文件的输出目录,这些库也会被加载。这里需要回答两个问题:1)如何在每次需要时自动复制 DLL?2)如何验证运行程序时加载了哪些 DLL?
1)您可以将以下内容添加到您的项目.pro中:
win32 {
CONFIG += file_copies
CONFIG(debug, debug|release) {
openssllibs.path = $$OUT_PWD/debug
} else {
openssllibs.path = $$OUT_PWD/release
}
contains(QMAKE_TARGET.arch, x86_64) {
openssllibs.files = C:/Qt/Tools/OpenSSL/Win_x64/bin/libcrypto-1_1-x64.dll \
C:/Qt/Tools/OpenSSL/Win_x64/bin/libssl-1_1-x64.dll
} else {
openssllibs.files = C:/Qt/Tools/OpenSSL/Win_x86/bin/libcrypto-1_1.dll \
C:/Qt/Tools/OpenSSL/Win_x86/bin/libssl-1_1.dll
}
COPIES += openssllibs
}
这就对了。现在,您的程序将始终将 Qt/Tools 中的最新库复制到项目的输出目录中,而不必担心您是否在调试或发布模式、32/64 位或其他 Qt 套件下进行编译。
2) 运行程序,同时检查加载的 DLLProcess Explorer,作者:Mark Russinovich。为此,请在 Process Explorer->View->Show lower pane 中,然后在上部窗格中选择正在运行的程序。下部窗格列出了所有加载的 DLL 和来源。还有其他类似的实用程序,例如开源进程黑客.
即使理解了上述所有内容,并严格遵循配方,您的程序仍然无法打印所需的输出。请像这样更改 qml 中的 logResults() 函数:
function logResults(results) {
console.log("RESULTS Length=", results.length);
console.log("results.substr=", results.substr(0, 20));
}
您将得到以下输出:
qml: calling callback
qml: RESULTS Length= 47932
qml: results.substr= <!doctype html><html
解释: 看起来像console.log()
Windows 中有大约 32K 的限制(Linux 上没有)。从远程主机检索的文档要大得多,这会破坏日志记录功能。这可能是 Qt 中的一个错误(它不应该像那样默默地失败)。
对于将来来到这里的任何人的另一个建议:这并不是严格需要的,但您可能需要在您的帐户中进行验证main()
函数表明 SSL 可用,代码如下:
#include <QDebug>
#include <QSslSocket>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
if (!QSslSocket::supportsSsl()) {
qDebug() << "Sorry, OpenSSL is not supported";
return -1;
}
qDebug() << "build-time OpenSSL version:" << QSslSocket::sslLibraryBuildVersionString();
qDebug() << "run-time OpenSSL version:" << QSslSocket::sslLibraryVersionString();
[...]
}