在 64 位 Windows 10 上安装 OpenSSL for MSVC2017

2023-12-15

.pro

LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibssl
LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibcrypto
INCLUDEPATH += C:\Qt\Tools\OpenSSL\Win_x86\include

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0

Window {
    visible: true
    width: 640
    height: 480

    Component.onCompleted: getPage(logResults)

    function logResults(results) {
        console.log("RESULTS: " + results)
    }

    function getPage(callback) {
        var xhttp = new XMLHttpRequest();
        var url = "https://www.google.com/"

        xhttp.onreadystatechange = function() {
            if (xhttp.readyState === 4 && xhttp.status === 200) {
                console.log("calling callback")
                callback(xhttp.responseText)
            }
        };
        xhttp.open("GET", url);
        xhttp.send();
    }
}

预期产出

qml: calling callback
qml: RESULTS: <html>

实际产量

qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_set_psk_use_session_callback
qml: calling callback

Windows 10 64位操作系统,运行MSVC2017 QML项目

I ran C:\Qt\MaintenanceTool.exe安装Developer and Designer Tools > OpenSSL 1.1.1d Toolkit

我试过以下之前的教程 and MSVC2017 的另一张但没有运气解决错误或得到xhttp.responseText。发现该代码适用于 ubuntu 19.4所以只要我在 Windows 机器上运行 OpenSSL 就会发生一些奇怪的事情。我无法通过谷歌搜索输出的错误消息找到任何解决方案。我读过,意外地将 openSSL 安装到“windows 目录”可能会导致错误,但我无法实际找到有问题的“windows 目录”来检查是否这样做。

edit

From C:\Qt\Tools\OpenSSL\Win_x64\bin我复制了libcrypto-1_1-x64.dll and libssl-1_1-x64.dll到我的项目的\debug and \release文件夹。这消除了 qt.network.ssl 错误,但是我仍然没有得到预期的输出qml: RESULTS: <html>


您运行 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();
    [...]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 64 位 Windows 10 上安装 OpenSSL for MSVC2017 的相关文章

随机推荐

  • Excel VBA 应用程序.OnTime。我认为使用这个……想法是个坏主意?

    我支持的许多用户要求事情自动发生 当然更自动 但这是另一点 一个希望事件每 120 秒发生一次 请参阅我的其他问题 另一个希望在每个工作日下午 5 点发生一件事 这必须在 Excel 工作表上 因此 VBA 作为插件等将是不行的 因为它需要
  • HTML 画布矩形内的阴影效果

    背景 我正在使用浏览器 HTML5 canvas 元素 我有代码 我在网上找到 允许我在画布上绘制一个矩形 Question 我想在鼠标移动事件触发时应用如图所示的 阴影 效果 如何才能实现这一目标 当前方法 我当前的方法是在触发 mous
  • ASP.NET 会话和删除文件夹

    我有一个网络应用程序 管理员可以在其中创建新闻 pdf 文档和他的 cms 面板中的其他内容 问题是 当管理员删除新文件或其他文件时 应用程序会删除与该新文件相关的所有文件 我指的是图像 pdf 和其他文档 主要问题是这些文件存储在 新闻
  • 如何从 JSF 数据表内的 selectOneMenu 获取值?

    我有一个包含一堆行的 JSF 数据表 每行内部都有一个 selectOneMenu 如下所示
  • 跨 PHP、MySQL 等管理日期的最佳方法是什么?

    我的服务器在达拉斯 我在纽约市 PHP 和 MySQL 都有用于设置时区的配置变量 我如何让他们一起工作 我应该在 MySQL 中存储哪些日期 如何让 PHP 根据用户的偏好来处理日期更改 请记住 我认为我从未让 PHP 显式设置过日期 它
  • 从 ASMX Web 服务返回 JSON,无需 XML 包装器?

    我需要从 C Web 服务获取 Json 数据 我知道有几个基于此的问题 相信我 我已经阅读了很多 但只是让我更加困惑 这就是我所做的 在我的网络服务中 我包括 System Web Script Services ScriptServic
  • 是否可以为内嵌文本创建框阴影效果?

    我想创建这样的效果 有没有办法通过 CSS JS 来做到这一点 非常感谢 我是网页设计的新手 在过去的几个小时里我一直在努力解决这个问题 下面是一种仅使用 CSS 即可实现文本多行 填充 突出显示行为的方法 这是基于其他地方找到的 box
  • python 线程 - 迭代 n 个任务时始终有 x 个活动线程

    我基本上想做的是 import threading import Queue def test thread elem q q put elem 2 a 1 2 3 4 5 6 7 8 q Queue Queue results for x
  • 我可以在 __new__ 或 __init__ 期间创建类属性吗?

    我想做这样的事情 但到目前为止我还没有取得多大成功 我想让每个 attr 成为一个仅在访问时计算 lazy eval 的属性 class Base object def init self for attr in self myattrs
  • 删除Python字典中的重复值

    我在 Stack Overflow 上发现了这个问题从字典中删除重复项另一个问题中的人也有我同样的问题 我尝试了他们给他的解决方案 但没有一个有效 你能帮助我吗 这是我的清单 然后这是我的代码 def printed filename da
  • 获取 WordPress 中激活插件的列表并从管理菜单中删除插件链接

    是否可以在 WordPress 中获取激活插件列表并将其从管理菜单栏中删除 我想从管理栏中删除所有激活插件链接 找出页面并替换your plugin page 这将列出所有激活的插件 apl get option active plugin
  • 更改子图上的刻度数

    如果我有一个子图 如何更改其刻度数 我不知道数据的最大值和最小值 我的代码是 azal rif add subplot 111 azal plot eels 10 9 averspe label data azal plot eels 10
  • C#:创建单个机器人服务以支持多个机器人应用程序

    该代码位于该网站上https www microsoft com reallifecode 2017 01 10 creating a single bot service to support multiple bot applicati
  • 没有为 Rack::Session::Cookie 警告提供秘密选项?

    我在 Fedora 17 下运行 Rails 3 2 3 Ruby 1 9 当我运行时 我收到此警告rails s 我该如何解决 安全警告 没有向 Rack Session Cookie 提供秘密选项 这构成了安全威胁 强烈建议您 提供一个
  • C++ 类中的成员是否保证是连续的?

    C 中的类成员是否保证是连续的 我尝试使用几乎所有流行的 C 编译器运行以下代码 并且all其中的结果是 4 它是变量 y 的相对地址 这是巧合 还是语言规范保证如此 难道编译器不会让成员 x 和 y 与类基本地址连续 彼此连续吗 请注意t
  • HTML5 - 拖放 div 和内部图像

    我有这种类型的元素 div style margin 20px background red height 400px width 400px a href target blank img style margin 40px src ht
  • 内存错误 Numpy/Python 欧几里得距离

    我正在尝试使用 numpy 和 python 运行 K 均值聚类算法 但如果我使用较大的 K 值 任何大于 10 的值似乎都会导致错误 就会不断遇到内存错误 我有两个大小为 42000 784 数据集 和 K 784 质心 的 numpy
  • 动态更改反应模式数据

    我有一个父组件 App js和一个子组件 MealModal js 当用户单击特定的餐食卡时 它会引发一个模式 该模式应显示有关餐食的更多信息 因此 我尝试找到一种方法来动态更改模态数据 具体取决于单击的餐卡 我尝试将餐食 ID 传递给on
  • 如何在循环中使用 woocommerce 数据属性

    我有一个自定义产品类型和自定义循环用于列出 woocommerce 产品 query args array post type gt product tax query gt array array taxonomy gt product
  • 在 64 位 Windows 10 上安装 OpenSSL for MSVC2017

    pro LIBS LC Qt Tools OpenSSL Win x86 lib llibssl LIBS LC Qt Tools OpenSSL Win x86 lib llibcrypto INCLUDEPATH C Qt Tools