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

2023-12-21

马上,对于问题的长度感到抱歉,但这是由于我提供的所有附加详细信息,我希望这些详细信息可以帮助更快地解决问题

我想实现什么目标?

我需要创建一个具有 SSL 支持的便携式(一体化)应用程序。

问题是什么?

因此,我面临的核心问题是将 SSL 支持纳入我的二进制/便携式应用程序中。

A MCVE该应用程序的功能很简单:

Project .pro file

QT -= gui
QT += network

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

SOURCES += \
        main.cpp

INSTALLS += target

Project 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();
}

  • 输出在我的开发机:

    Is SSL Enabled?  true
    SSL Library Build Version (Qt compiled against):  "OpenSSL 1.1.1d  10 Sep 2019"
    SSL Library Version String (available locally):  "OpenSSL 1.1.1d  10 Sep 2019"

开发机信息

    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

    C:\Users\cybex>openssl
    WARNING: can't open config file: /z/extlib/_openssl_/ssl/openssl.cnf
    OpenSSL> version
    OpenSSL 1.0.2g  1 Mar 2016

  • 在新的 Windows 10 x86 计算机上运行相同的二进制文件会导致:

    Is SSL Enabled?  false
    SSL Library Build Version (Qt compiled against):  "OpenSSL 1.1.1d  10 Sep 2019"
    SSL Library Version String (available locally):  ""

试验机信息(完全全新安装 - Windows 10 x86)

    C:\Users\cybex>echo %PATH%
    C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\
    C:\Users\cybex>openssl
    'openssl' is not recognized as an internal or external command,
    operable program or batch file.

  • 在新的 Windows 7 x64 计算机上运行相同的二进制文件会导致:

    Is SSL Enabled?  false
    SSL Library Build Version (Qt compiled against):  "OpenSSL 1.1.1d  10 Sep 2019"
    SSL Library Version String (available locally):  ""

试验机信息(已安装驱动程序的 Windows 7 x64 笔记本电脑)

    C:\Users\Home>echo %PATH%
    C:\Program Files (x86)\OpenSSL\libs;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files (x86)\OpenSSL\libs;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\
    C:\Users\Home>openssl
    'openssl' is not recognized as an internal or external command, operable program or batch file.

通过查看上面的结果,我得出结论,安装OpenSSL可以解决问题。很好,但我希望将其包含在我的便携式应用程序中。

为了实现这一目标,我需要

  1. 使用 OpenSSL 支持静态编译 Qt

我在以下人员的帮助下做到了这一点这个脚本 https://pastebin.com/4mGtCVf9改编自ps1 powershell脚本 https://sourceforge.net/p/qtlmovie/code/ci/v1.2.16/tree/build/windows-build-qt-static.ps1?format=raw found 在 Qt 的 wiki 上 https://wiki.qt.io/Building_a_static_Qt_for_Windows_using_MinGW。我做了补充:

  • OpenSSL 主页$OPENSSL_HOME

  • 线程数$threads, and

  • 架构类型$arch要使用的。

Qt 编译详细信息和 OpenSSL 信息

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

  • MK规格: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)"

Note 1:

我在用-openssl并不是-openssl-linked。我尝试过用这两种方法构建 Qt 的几种变体-openssl and -openssl-linked. -openssl-linked永远无法成功构建,请参阅这个帖子 https://forum.qt.io/topic/107364/static-compile-qt-5-13-1-with-openssl-1-1-1d-using-mingw-in-windows-10我提出了原因。

Note 2:

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

OpenSSL 安装(仅在 DEV 机器上)位于

`$OPENSSL_HOME = "C:\OpenSSL-Win32"` 

我在哪里使用静态编译的MinGWOpenSSL 的库,位于

`$OPENSSL_HOME = "C:\OpenSSL-Win32\lib\MinGW",`

文件内容为C:\OpenSSL-Win32\lib\MinGW is:

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
  1. 将链接项目 .pro 添加到 OpenSSL 库

我将 OpenSSL 库添加到.pro使用 2 种方法创建文件(库是静态编译的 MinGW OpenSSL 库,位于C:\OpenSSL-Win32\lib\MinGW)

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

QT -= gui
QT += network

# OpenSSL static .a libraries
INCLUDEPATH += "C:\OpenSSL-Win32\include"
LIBS += -L"C:\OpenSSL-Win32\lib\MinGW\libssl.a"
LIBS += -L"C:\OpenSSL-Win32\lib\MinGW\libcrypto.a"

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

SOURCES += \
        main.cpp

INSTALLS += target

Note 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

上面添加了库的二进制文件(在我的 Windows 10 x86 测试机上)的 LDD 输出是:

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 文件

使用 (External Library> 进口.a文件>Static & Windows仅有选项no debug suffix)

QT -= gui
QT += network

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

SOURCES += \
        main.cpp

INSTALLS += target

win32: LIBS += -L$$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/ -lssl

INCLUDEPATH += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW
DEPENDPATH += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/ssl.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/libssl.a

win32: LIBS += -L$$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/ -lcrypto

INCLUDEPATH += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW
DEPENDPATH += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/crypto.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../OpenSSL/OpenSSL-Win32/lib/MinGW/libcrypto.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

使用自动库导入,上面添加的库的二进制文件(在我的 Windows 10 x86 测试机上)的 LDD 输出为:

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

开发机器的应用程序输出是SSL enabled正如我之前的文章中提到的(对于手动和自动库输入):

Is SSL Enabled?  true
SSL Library Build Version (Qt compiled against):  "OpenSSL 1.1.1d  10 Sep 2019"
SSL Library Version String (available locally):  "OpenSSL 1.1.1d  10 Sep 2019"

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

Is SSL Enabled?  false
SSL Library Build Version (Qt compiled against):  "OpenSSL 1.1.1d  10 Sep 2019"
SSL Library Version String (available locally):  ""

因此,由于 OpenSSL 库不存在,因此在非开发(新/客户端)计算机上请求 SSL 连接时会导致以下错误:

QSslSocket::connectToHostEncrypted:TLS 初始化失败

这是 OpenSSL 库未作为依赖项包含在二进制文件中的结果。所以基本上,将静态 OpenSSL 库添加到项目文件中不起作用,或者我在某处做了错误的事情。

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

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

对于解决这个问题的建议将不胜感激。


Update 1

我已经解决了这个问题-openssl-linked。原因(或者更确切地说是修复)是没有将 OpenSSL 安装到您的计算机上。相反,提取.a & include目录到一个单独的目录。所以一切都是一样的,除了你有libs & include无需安装。

然后使用标准配置(上面提到的),替换-openssl with -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 & INCLUDEPATH。两者都会导致失踪dll是必需的。


The -openssl配置选项将 Qt 配置为动态加载 libopenssl using LoadLibrary或其他平台等效功能。所以从现在开始,你的一切努力都是徒劳的。您需要返回并解决 -openssl 链接的问题。

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

静态 OpenSSL *.a 库未链接目标二进制文件(使用带有 SSL 的静态编译 Qt) 的相关文章

随机推荐

  • Spark 结构化流 - 由于输入源数量增加而导致检查点中出现断言错误

    我正在尝试将两个流合并为一个并将结果写入一个主题 代码 1 阅读两个主题 val PERSONINFORMATION df DataFrame spark readStream format kafka option kafka boots
  • 提高重叠片段可视化的性能

    我有一组 x 点对 用于沿 x 轴绘制线段 以在 R 中创建自定义读取映射 绘制这些线段的一半任务是确定它们的 y 位置 以便没有两个重叠的线段位于同一 y 水平上 对于每个段 我从第一个位置迭代 y 个级别 直到到达尚未包含与当前段重叠的
  • Angularjs ng-单击重复表行不起作用

    在 AngularJS 中 ng click 以下 HTML 对我不起作用 tr td ai name td td ai desc td tr 我的控制器中的 go 功能目前只有 scope go function hash console
  • 如何使用 sns.boxplot 或 sns.catplot 添加剖面线到箱线图

    I need to add hatches to a categorical box plot What I have is this 我需要的是这样的 带有中线 我尝试过的是这段代码 exercise sns load dataset e
  • 存储库模式与活动记录模式相同吗?

    他们似乎很相似 他们是不同的 活动记录模式定义 An包装数据库中的行的对象表或视图 封装数据访问 并在该数据上添加域逻辑 在存储库模式中全部数据访问放在单独的类中并通过实例方法进行访问 对我来说 这样做是有益的 因为数据访问现在封装在一个单
  • 在哪里存储桌面应用程序的用户数据?

    我正在开发 C NET 桌面应用程序 我希望用户能够创建新的数据库文件 我是桌面应用程序的新手 我真的不知道存储这些文件的最佳位置在哪里 我想将它们存储在我的应用程序文件夹中 但我读到这不是最好的解决方案 我应该将它们存储在 C 中还是有其
  • 需要 XAML 教程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Silverlight 新手 我需要一个教程来帮助我理解 XAML 样式 资源和对象绑定到 UI
  • 如何根据环境设置facebook认证密钥?

    我有一个 Rails 应用程序 它使用omniauth 通过 Facebook 对访问者进行身份验证 当您向 Facebook 注册应用程序时 您必须注册一个回调 URL 一旦完成身份验证过程 他们将重定向到该回调 URL 由于我的生产站点
  • 使用ngx-bootstrap modalService时添加自定义类的方法

    当寻找ngx引导程序 https valor software com ngx bootstrap 源代码 https github com valor software ngx bootstrap here 模态选项 class ts h
  • x86 PIC,QEMU 在所有 CPU 上引发中断是否正确?

    我最近不得不解决 x86 PIC 的专有操作系统问题 其中操作系统预期定时器中断仅在 CPU0 上 我启用了 IO APIC 来解决这个问题并进行了 CPU 控制 因此中断仅到达 CPU0 问题解决了 有人告诉我 我们的硬件已经损坏 无法做
  • Tensorflow:使用 CPU 的特定核心执行操作

    目前可以通过 tf device 函数指定用于特定操作的 CPU 或 GPU 但是无论如何您都可以指定一个coreCPU 的 目前没有用于将操作固定到特定核心的 API 尽管这将是一个很好的选择功能要求 https github com t
  • 子类化 UIAlertController 并遇到运行时错误

    我是 iOS 和 OSX 编程新手 决定从 Swift 开始 使用 iOS8 API 来测试应用程序 并尝试一些我在其他环境中使用的编程技术 然而 我遇到了一个奇怪的情况 我希望有人能够识别并帮助我 这涉及到 UIAlertControll
  • 自定义 std::allocator_traits::construct

    我想定制std vector不默认构造元素类型的行为 例如int 因为对于大向量来说这样做的成本很高 看着这个 我认为做到这一点的唯一方法就是专业化std allocator traits
  • 当 ssh 管道损坏时停止 python 程序

    我正在编写一个带有无限 while 循环的 python 脚本 我正在 ssh 上运行该脚本 我希望脚本在有人杀死 ssh 时终止 例如 脚本 script py while True do something 将运行为 ssh foo s
  • 如何使用 WebDriver 单击

    这是一段UI代码
  • 重写从 us-central1 以外的其他区域从托管到云功能的路由

    我有一个http触发的云函数部署在欧洲 西部1区域和使用 firebase 托管托管的 Web 应用程序 我还在我的中设置了对该 http 函数的重写firebase json file 我注意到重写仅适用于美国中央1功能 有没有办法让重写
  • django根据文本长度过滤

    我想根据文本的长度过滤我的模型 就像是 MyModel objects filter len text gt 10 其中 text 是 MyModel 模型中的 Char 或 Text 字段 对于现代 Django gt 1 9 海内克 h
  • (为什么)使用未初始化的变量是未定义的行为?

    如果我有 unsigned int x x x 很明显x should在这个表达式之后为零 但是我到处都看到 他们说behavior这段代码的值是未定义的 而不仅仅是x 直到减法之前 两个问题 Is the behavior这段代码确实未定
  • 在Matlab中,如何将嵌套for循环生成的值存储在数组中?

    y find sA l y sA for i 1 10 for j 1 l l sA end y y length y end 我想知道如何存储生成的值l 对于每次迭代 在数组中 当我尝试做类似 l l l sA 的事情时我得到了 奇怪 的
  • 静态 OpenSSL *.a 库未链接目标二进制文件(使用带有 SSL 的静态编译 Qt)

    马上 对于问题的长度感到抱歉 但这是由于我提供的所有附加详细信息 我希望这些详细信息可以帮助更快地解决问题 我想实现什么目标 我需要创建一个具有 SSL 支持的便携式 一体化 应用程序 问题是什么 因此 我面临的核心问题是将 SSL 支持纳