C++ 静态OpenSSL*.a库未链接到目标二进制文件(使用静态编译的Qt和SSL)

C++ 静态OpenSSL*.a库未链接到目标二进制文件(使用静态编译的Qt和SSL),c++,qt,ssl,openssl,C++,Qt,Ssl,Openssl,很抱歉,问题太长了,但这是由于我提供的所有额外细节,我希望这些细节可以帮助您更快地解决问题 我想要实现什么? 我需要创建一个支持SSL的可移植(一体式)应用程序 有什么问题吗? 因此,我面临的核心问题是在我的二进制/便携式应用程序中包含SSL支持 应用程序的MCVE很简单: Project.pro文件 QT -= gui QT += network CONFIG += c++11 console CONFIG -= app_bundle SOURCES += \ main.c

很抱歉,问题太长了,但这是由于我提供的所有额外细节,我希望这些细节可以帮助您更快地解决问题

我想要实现什么?

我需要创建一个支持SSL的可移植(一体式)应用程序

有什么问题吗?

因此,我面临的核心问题是在我的二进制/便携式应用程序中包含SSL支持

应用程序的MCVE很简单:

Project
.pro
文件

QT -= gui
QT += network

CONFIG += c++11 console
CONFIG -= app_bundle

SOURCES += \
        main.cpp

INSTALLS += target
项目
main.cpp

#include <QCoreApplication>
#include <QSslSocket>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Is SSL Enabled? " << QSslSocket::supportsSsl();
    qDebug() << "SSL Library Build Version (Qt compiled against): " << QSslSocket::sslLibraryBuildVersionString();
    qDebug() << "SSL Library Version String (available locally): " << QSslSocket::sslLibraryVersionString();

    return a.exec();
}
开发机器的信息

    C:\Users\cybex>echo %PATH%
    C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin


  • 在新的Windows 10 x86计算机上运行相同的二进制文件会导致:
测试机信息(全新安装-Windows 10 x86)


  • 在新的Windows 7 x64计算机上运行相同的二进制文件会导致:
测试机信息(安装了驱动程序的Windows 7 x64笔记本电脑)

通过查看上述结果,我得出结论,安装OpenSSL解决了这个问题。很好,但我想把它包含在我的便携应用程序中

要做到这一点,我必须

  • 使用OpenSSL支持静态编译Qt
  • 我是在改编自
    ps1
    found的帮助下完成这项工作的。我补充了以下内容:

    • OpenSSL home
      $OpenSSL\u home

    • 线程数
      $threads
      ,以及

    • 要使用的架构类型
      $arch

    Qt编译详细信息和OpenSSL信息

    • 编译器:
      mingw32
      位于
      C:\Qt\Qt5.13.1\Tools\mingw730\u 32\bin

    • mkspec:
      win32-g++
      (如果有区别的话)

    • OpenSSL版本(32位):1.1.1d

    配置如下所示:

    cmd /C "configure.bat -static -debug-and-release -platform win32-g++ -prefix $QtDir `
            -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -sql-sqlite -ssl -openssl -I $($OPENSSL_HOME)\include -L$($OPENSSL_HOME)\lib\MinGW`
            -opensource -confirm-license `
            -make libs -nomake tools -nomake examples -nomake tests -v"
    cmd /C "mingw32-make -k -j$($threads)"
    
    注1:

    我使用的是
    -openssl
    ,而不是
    -openssl链接的
    。我尝试了几种使用
    -openssl
    -openssl-linked
    构建Qt的变体<代码>-openssl链接无法成功构建,请参阅我所做的解释

    注2:

    我唯一成功的静态Qt编译是启用了
    -ssl-openssl
    配置标志

    OpenSSL安装(仅在开发人员计算机上)位于

    我使用的是OpenSSL静态编译的
    MinGW
    库,位于

    `$OPENSSL_HOME = "C:\OpenSSL-Win32\lib\MinGW",`
    
    C:\OpenSSL-Win32\lib\MinGW
    的文件内容是:

    Directory: C:\OpenSSL-Win32\lib\MinGW
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----       2019/09/11     18:11        3347286 libcrypto.a
    -a----       2019/09/11     18:10         109020 libcrypto.def
    -a----       2019/09/11     18:11         385126 libssl.a
    -a----       2019/09/11     18:10          14033 libssl.def
    
  • 将link project.pro添加到OpenSSL库
  • 我使用两种方法将OpenSSL库添加到
    .pro
    文件中(库是静态编译的MinGW OpenSSL库,位于
    C:\OpenSSL-Win32\lib\MinGW

    将库手动输入到.pro文件中 注3

    包含和不包含上述链接库的二进制大小保持不变

    上面添加了库的二进制文件(在我的开发机器上)的LDD输出是:

    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    上面添加了库的二进制文件(在我的Windows 10 x86测试机上)的LDD输出为:

    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    

    Qt库导入到.pro文件 使用(
    外部库
    >导入
    .a
    文件>
    静态
    &
    窗口
    仅具有
    无调试
    后缀的选项)导入

    使用自动二进制导入,二进制文件的LDD输出(在我的开发机器上)以及上面添加的库是:

    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    使用自动库导入,带有上述添加库的二进制文件(在我的Windows 10 x86测试机上)的LDD输出为:

    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\QtProjects\build-SSL-Test-Desktop_Qt_Op...
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    Start-Process -PassThru .\SSL-Test.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
          6280 SSL-Test.exe                                       C:\Users\cybex\Desktop\SSL-Test.exe
          1512 ntdll.dll                                          C:\Windows\SYSTEM32\ntdll.dll
           596 KERNEL32.DLL                                       C:\Windows\system32\KERNEL32.DLL
          1500 KERNELBASE.dll                                     C:\Windows\system32\KERNELBASE.dll
    
    dev机器的应用程序输出是启用了SSL的

    测试机器(未安装OpenSSL)的应用程序输出与之前相同(手动和自动库输入):


    因此,在OpenSSL库不存在的情况下,在非Dev(fresh/client)计算机上请求SSL连接时会导致以下错误:

    QSslSocket::connectToHostEncrypted:TLS初始化失败

    这是OpenSSL库未作为依赖项包含在二进制文件中的结果。因此,基本上,向项目文件中添加静态OpenSSL库不起作用,或者我在某个地方做了一些不正确的事情

    注4: 为什么问题的标题不是:如何将静态库导入Qt?

    导入静态库很简单,并不复杂。我假设我在启用SSL支持的Qt静态编译中犯了错误

    如能提供解决此问题的建议,将不胜感激


    更新1 我已经用
    -openssl-linked
    解决了这个问题。原因(或者更确切地说是修复)是不在您的机器上安装OpenSSL。相反,将
    .a
    include
    目录提取到单独的目录中。因此,除了在不安装的情况下使用
    lib
    s&
    include
    之外,一切都是一样的

    然后使用标准配置(如上所述),将
    -openssl
    替换为
    -openssl-linked
    ,您应该可以成功编译

    更新的问题

    使用新链接的OpenSSL Qt工具包构建和运行我的应用程序时,我收到一条消息说:

    无法继续执行代码,因为找不到libcrypto.dll。重新安装程序可能会解决此问题

    接着是另一个对话框

    无法继续执行代码,因为找不到libssl.dll。重新安装程序可能会解决此问题

    LDD要求:

    Start-Process -PassThru .\MyAwesomeApp.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
         22708 MyAwesomeApp.exe                                     C:\Users\CybeX\QtProjects\build-MyAwesomeApp-Desktop_Qt_OpenSSL_Linked_5_13_1_MinGW_32bit-Release\release\MyAwesomeApp.exe
          1924 ntdll.dll                                          C:\WINDOWS\SYSTEM32\ntdll.dll
           328 wow64.dll                                          C:\WINDOWS\System32\wow64.dll
           480 wow64win.dll                                       C:\WINDOWS\System32\wow64win.dll
            40 wow64cpu.dll                                       C:\WINDOWS\System32\wow64cpu.dll
    
    在使用和不使用.pro
    LIBS的情况下都进行了测试
    
    Start-Process -PassThru .\MyAwesomeApp.exe | Get-Process -Module
    
       Size(K) ModuleName                                         FileName
       ------- ----------                                         --------
         22708 MyAwesomeApp.exe                                     C:\Users\CybeX\QtProjects\build-MyAwesomeApp-Desktop_Qt_OpenSSL_Linked_5_13_1_MinGW_32bit-Release\release\MyAwesomeApp.exe
          1924 ntdll.dll                                          C:\WINDOWS\SYSTEM32\ntdll.dll
           328 wow64.dll                                          C:\WINDOWS\System32\wow64.dll
           480 wow64win.dll                                       C:\WINDOWS\System32\wow64win.dll
            40 wow64cpu.dll                                       C:\WINDOWS\System32\wow64cpu.dll
    
    perl Configure VC-WIN32 no-shared --prefix=C:\Build-OpenSSL-VC-32-STATIC