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

时间:2013-12-30 16:11:51

标签: c++ qt static openssl qtnetwork

原始问题略有不同,但是是一个更重要问题的一部分。

我正在尝试使用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"

4 个答案:

答案 0 :(得分:12)

  

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

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

-openssl-linked

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

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

话虽如此,如果没有您的参与,最终用户需要提供安全更新,建议不要对openssl使用静态链接。考虑一下如果你走了会发生什么,不再在这个项目上工作等等。

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

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

答案 1 :(得分:1)

  

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 Capable Library时,我在指定共享对象时遇到了一些问题,因为运行时链接程序在/usr/lib/usr/lib64中使用了分发的OpenSSL。 OpenSSL FIPS Capable Library是您在FIPS_mode_set上调用的库。

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

总结一下,不要忘记-l-L-Wl,-Bstatic。完全指定所需内容并使用完全限定的库路径名,并将它们用作目标文件。如果要指定共享对象,请使用rpath

答案 2 :(得分:0)

这是我使用 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\qt5 qt5vars.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版本在您的项目中使用创建新工具包

答案 3 :(得分:0)

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

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

从此处下载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