Install OpenSSL for MSVC2017 on 64-bit Windows 10

后端 未结 1 939
灰色年华
灰色年华 2021-01-29 04:20

.pro

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


        
相关标签:
1条回答
  • 2021-01-29 04:24

    You ran C:\Qt\MaintenanceTool.exe to install Developer and Designer Tools > OpenSSL 1.1.1d Toolkit

    That is also my recommendation. The alternative is to compile OpenSSL yourself, or download a binary package from a third party provider. I have one of those packages installed at "C:\Program Files\OpenSSL-Win64\bin", and programs using Qt+=network are able to locate and load the libraries when their path is included in the PATH environment variable. The problem is that you will need to take care of the updates yourself, but the Qt packages are automatically updated with the MaintenanceTool along with Qt and Qt Creator. So pick your choice.

    Anyway, even if you have another set of OpenSSL DLLs in your path, if you copy the libraries to the output directory of your executable, these libraries will be loaded instead. Two questions need to be answered here: 1) how do you copy the DLLs automatically each time they are needed?, and 2) how do you verify which DLLs are loaded when you run your program?

    1) You may add the following to your project .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
    }
    

    That is it. Now your program will always have the latest libraries from Qt/Tools copied to the output directory of your project, without worrying if you compile in debug or release mode, or 32/64 bits, or another Qt Kit.

    2) Run your program while inspecting the loaded DLLs with Process Explorer, by Mark Russinovich. To do so, in Process Explorer->View->Show lower pane, and select your running program in the upper pane. The lower pane lists all your loaded DLLs and origins. There are other similar utilities out there, like the open source Process Hacker.

    Even understanding all of the above, and following exactly the recipe, your program still does not print the desired output. Please change the function logResults() in your qml like this:

    function logResults(results) {
        console.log("RESULTS Length=", results.length);
        console.log("results.substr=", results.substr(0, 20)); 
    }
    

    You will get the following output:

    qml: calling callback
    qml: RESULTS Length= 47932
    qml: results.substr= <!doctype html><html
    

    Explanation: looks like console.log() has a limitation of about 32K in Windows (it doesn't on Linux). The document retrieved from the remote host is much larger, and this breaks the logging function. This is probably a bug in Qt (it should not fail silently like that).

    Another advice for anybody coming here in the future: It is not strictly needed, but you may want to verify in your main() function that SSL is available, with something like this code:

    #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();
        [...]
    }
    
    0 讨论(0)
提交回复
热议问题