【问题标题】:Is there any way to building static Qt with static OpenSSL?有没有办法用静态 OpenSSL 构建静态 Qt?
【发布时间】:2014-01-17 13:17:06
【问题描述】:

原始问题略有不同,但属于更重要的问题。

我正在尝试在 Windows 上使用静态 OpenSSL 将 Qt 5.2 构建为静态。

我的最终目标是发布单个二进制文件,而无需提供 libeay32.dll 和 ssleay32.dll。然而,在我看来,这是不可能的。我使用静态 openssl 库构建了静态 Qt,但似乎 Qt 完全忽略了提供的库并始终搜索 DLL。

This 的回答还表明 QtNetwork 总是搜索 DLL 并忽略其他所有内容,但它还指出“两个选项是 将 OpenSSL 编译到 Qt...”但这似乎并不就这样吧。

有人能给出明确的答案吗?

这是我的 Qt 配置(为便于阅读添加了换行符):

configure -static -qmake -opensource -nomake examples -opengl desktop
-platform win32-msvc2010 -openssl -I C:\git\openssl\build\include
-L C:\git\openssl\build\lib OPENSSL_LIBS="-llibeay32 -lssleay32 -lgdi32"

【问题讨论】:

  • 为什么不提供相关的nmake VERBOSE= 输出来查看传递给工具链的包含路径?
  • @Laszlo Papp:已编辑。
  • 不是 nmake VERBOSE=1 输出。
  • 你能具体说明要执行什么命令吗?因为这是我得到的输出。我会尝试清理配置以防万一。
  • 如您所见,openssl 包含路径未传递给编译器...

标签: c++ qt static openssl qtnetwork


【解决方案1】:

有没有办法用静态 OpenSSL 构建静态 Qt?

当然,配置Qt时需要使用以下选项:

-openssl-linked

原因是QtNetwork默认使用QLibrary类来动态打开库获取必要的符号。

这是告诉 Qt 不要这样做的选项,并尊重正常的链接规则。

话虽如此,如果最终用户需要在没有您参与的情况下使用安全更新,则不建议对 openssl 使用静态链接。考虑一下如果你离开了会发生什么,不再从事这个项目,等等。

此外,此设置并未经常测试,因此您实际上可能会遇到一些应该在上游修复的问题,但这是针对相关用例的解决方案设计。

免责声明:由于 SO 是关于编程的,因此我忽略了静态链接对 Qt 的许可后果,所以我想快速提醒您注意正确的用法,以免陷入法律纠纷。

【讨论】:

    【解决方案2】:

    OPENSSL_LIBS="-llibeay32 -lssleay32"...

    完全避免使用-l(以及-L-Wl,-Bstatic)。链接器有时会忽略静态链接请求(Apple),有时脚本会修改它(我无法告诉你有多少自定义构建脚本咬了我)。

    改为使用完全指定的存档,就像使用目标文件一样。在您的LDLIBS 中添加以下内容,这样脚本就不会搞砸或链接器忽略您的请求:

    /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a
    

    显然,您应该更改libssl.alibcrypto.a 的路径以匹配您的安装。

    如果您没有 LDLIBS,请将其添加到 LDFLAGS(或 IDE 中的“其他链接器标志”)。

    在 Qt 中,它看起来应该是 QMAKE_LFLAGSLIBS。或者你可以试试这个帖子:How to add "Additional Dependencies" (Linker settings)

    同样的技巧也适用于共享对象(但链接器偏爱共享对象,因此通常不会成为问题)。也就是说,您可以指定:

    /usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so
    

    像上面这样指定共享对象时要记住的是,您必须指定rpath 以确保运行时链接器获取消息。也就是说,您应该在LDFLAGS 或“其他链接器选项”中添加以下内容:

    -Wl,-rpath=/usr/local/ssl/lib
    

    在使用位于 /usr/local/ssl/lib 中的 OpenSSL FIPS 功能库时指定共享对象时,我被咬了几口,因为运行时链接器在 /usr/lib/usr/lib64 中使用分发版的 OpenSSL。 OpenSSL FIPS Capable Library 是您调用 FIPS_mode_set 的库。

    您还可以从该位置删除(或重命名)共享对象,只保留静态存档。过去在 Xcode for iPhone 下构建时,我不得不使用这种技术。 Xcode 拒绝使用静态存档,即使使用正确放置的-Bstatic。 (交叉编译器和修改后的工具链有时是最不适合使用的)。我认为你不应该修改安装目录,所以我一般不使用它技术。

    总而言之,不要有任何机会,避免使用-l-L-Wl,-Bstatic。完全指定您想要的内容并使用完全限定的库路径名,并像使用目标文件一样使用它们。如果要指定共享对象,请使用 rpath

    【讨论】:

    • -l 和 -L 实际上如果没有冲突就可以了,这也应该是 IMO 的建议,因为与指定完整路径相比,这更便携,而完整路径通常是特定于操作系统的.
    • Laszlo - 我有点同意,但我可以肯定地告诉你,链接器和脚本有时不会做你想做的事。当您放弃 -L-l-Bstatic 以支持完全指定库和档案(如目标文件)时,这种情况永远不会发生。我举了两个问题的例子(和 cen 也有类似的问题)。这是理论与实践的区别。
    • IMO,这是你的的做法,但当人们正确使用它时,情况就不是这样了。在 Qt 项目中编写依赖于平台的构建系统看起来不合适。
    • Lazlo - 好吧,随便。你说得对。您是否尝试过在 Apple 平台上测试“人们正确使用它不是那样”的理论?或者在 FIPS 库的备用位置使用 OpenSSL 时?
    • 是的,同样,OP 询问的是 Windows AFAICT,而不是 Apple。
    【解决方案3】:

    这就是我使用 MSVC 2013 在 Windows 上构建具有 SSL 支持的 Qt 5.7.1 的方式:

    确保可以在 PATH 环境变量中找到 Perl、Python 和 Ruby。

    从 github 存储库下载 Qt:

    cd C:\Qt
    git clone https://github.com/qt/qt5.git
    cd C:\Qt\qt5 
    git checkout 5.7 
    

    确保签出提交36e7cff94fbb4af5d8de6739e66164c6e6873586。此时,签出 5.7 正是这样做的。

    将以下内容放在位于C:\Qt\qt5qt5vars.bat 中。如果需要,请进行调整:

    @echo off
    
    REM Set up \Microsoft Visual Studio 2015, where <arch> is \c amd64, \c x86, etc.
    CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
    
    REM Edit this location to point to the source code of Qt
    SET _ROOT=C:\Qt\qt5
    
    SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%
    
    REM Uncomment the below line when using a git checkout of the source repository
    SET PATH=%_ROOT%\qtrepotools\bin;%PATH%
    
    REM Uncomment the below line when building with OpenSSL enabled. If so, make sure the directory points
    REM to the correct location (binaries for OpenSSL).
    SET PATH=C:\OpenSSL-Win32\bin;%PATH%
    
    REM When compiling with ICU, uncomment the lines below and change <icupath> appropriately:
    REM SET INCLUDE=<icupath>\include;%INCLUDE%
    REM SET LIB=<icupath>\lib;%LIB%
    REM SET PATH=<icupath>\lib;%PATH%
    
    REM Contrary to earlier recommendations, do NOT set QMAKESPEC.
    
    SET _ROOT=
    
    REM Keeps the command line open when this script is run.
    cmd /k
    

    之后,执行此文件并正确启动存储库:

    qt5vars.bat 
    perl init-repository
    

    最后,要成功配置和编译库(带有调试和发布版本),请确保 configure 引用的路径在您的系统上也有效:

    configure -static -static-runtime -debug-and-release -ssl -openssl -openssl-linked -opengl dynamic -platform win32-msvc2013 -prefix C:\Qt\qt5.7-msvc2013-static -nomake tests -nomake examples -I "C:\OpenSSL-Win32\include" -L "C:\OpenSSL-Win32\lib\VC\static" OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -lCrypt32" OPENSSL_LIBS_DEBUG="-lssleay32MTd -llibeay32MTd" OPENSSL_LIBS_RELEASE="-lssleay32MT -llibeay32MT"
    nmake
    nmake install
    

    到目前为止,一切都应该顺利而优美地运行。现在只需配置 Qt Creator 以检测这个新的 Qt 版本创建一个新的 Kit 在您的项目中使用:

    【讨论】:

      【解决方案4】:

      在 Win 10 上使用 OpenSSL 静态构建 Qt

      1. 从 Qt 维护工具下载 Qt 5.15.1 源代码。
      2. 安装 Python、Perl、OpenSSL、jom
      3. 确保它们位于 Path 环境变量中。
      4. 为 VS 2019 打开 x64 Native Tools 命令提示符

      从这里下载 OpenSSL https://slproweb.com/products/Win32OpenSSL.html

      # remove previous config cache
      rm /d/Qt/5.15.1/Src/config.cache
      
      set OPENSSL_DIR=C:\Program Files\OpenSSL-Win64
      configure.bat -release -opensource -confirm-license -static -no-pch -optimize-size -opengl desktop -platform win32-msvc  -prefix "D:\Qt\5.15.1\msvc2019_64_static" -skip webengine -nomake tools -nomake tests -nomake examples -openssl-linked OPENSSL_INCDIR="%OPENSSL_DIR%\include" OPENSSL_LIBDIR="%OPENSSL_DIR%\lib\VC\static" OPENSSL_LIBS="-lWs2_32 -lGdi32 -lAdvapi32 -lCrypt32 -lUser32 -llibssl64MDd -llibcrypto64MDd" OPENSSL_LIBS_DEBUG="-llibssl64MDd -llibcrypto64MDd" OPENSSL_LIBS_RELEASE="-llibssl64MD -llibcrypto64MD"  
      
      D:\jom_1_1_3\jom.exe -j8
      D:\jom_1_1_3\jom.exe -j8 install
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多