Javascript 在64位Windows 10上安装OpenSSL for MSVC2017
.proJavascript 在64位Windows 10上安装OpenSSL for MSVC2017,javascript,qt,get,openssl,qml,Javascript,Qt,Get,Openssl,Qml,.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 Win
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
运行MSVC2017 QML项目的Windows 10 64位操作系统
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
我运行了C:\Qt\MaintenanceTool.exe
来安装Developer and Designer Tools>OpenSSL 1.1.1d工具包
我尝试了以下操作,但没有成功地解决错误或获得xhttp.responseText
。我发现,所以我必须在我的windows机器上运行它,OpenSSL出现了一些奇怪的事情。通过谷歌搜索输出的错误消息,我找不到任何解决方案。我读过一篇文章,不小心将openSSL安装到“windows目录”可能会导致错误,但我无法实际找到所讨论的“windows目录”,以检查我是否找到了
编辑
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
从C:\Qt\Tools\OpenSSL\Win\u x64\bin
我将libcrypto-1\u 1-x64.dll
和libssl-1\u 1-x64.dll
复制到我项目的\debug
和\release
文件夹中。这删除了qt.network.ssl错误,但是我仍然没有得到qml:RESULTS:
您运行了C:\Qt\MaintenanceTool.exe来安装Developer和Designer
工具>OpenSSL 1.1.1d工具包
这也是我的建议。另一种方法是自己编译OpenSSL,或者从第三方提供商编译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) 使用检查加载的DLL时运行程序。为此,请在Process Explorer->View->Show下部窗格中,在上部窗格中选择正在运行的程序。下面的窗格列出了所有加载的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
如果在运行时加载OpenSSL,请尝试将dll(ssl和crypto)添加到路径中,或将它们放在.exe旁边。我已将
libcrypto-1_1-x64.dll
和libssl-1_1-x64.dll
添加到\debug
文件夹中,从而删除了错误。然而,输出仍然不存在。我希望qml:calling callback
和qml:RESULTS:
,但我只得到了公式,可能是您得到了意外的状态或readyState?请看,我也希望得到同样的结果,只是它肯定得到了readyState 4和状态200,因为这一行:if(xhtp.readyState==4&&xhtp.status==200){
这肯定会导致这种情况:console.log(“调用回调”)
,所以我知道它正在调用回调(xhttp.responseText)
,它在Ubuntu 18.4和19.4中工作,只是不在我的windows 10环境中编辑对不起,我应该澄清一下,我确实尝试过console.log()
在readyState和status上,两者都按预期输出了4
和200
,我刚刚在cmd中验证了curlhttps://www.google.com
返回预期的HTMLHANKS Pedro,我今晚将尝试此解决方案,并向您报告。正如您所说,它一直在工作,只是默默地失败。谢谢“我很高兴能提供帮助。此问题的console.log()
值得进一步调查,并向Qt提交一份适当的错误报告。此问题后创建的错误报告需要支持。如果您对其解决方案感兴趣,请投票、评论和观看。此问题现在已在Qt 5.14.2中修复: