16

原始问题略有不同,但属于更主要问题的一部分。

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

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

这个答案还表明 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

4 回答 4

12

Is there any way to building static Qt with static OpenSSL?

Sure, you need to use the following option when configuring Qt:

-openssl-linked

The reason is that QtNetwork uses the QLibrary class by default for dynamically opening the library to get the necessary symbols.

This is the option to tell Qt not to do so, and respect the the normal linkage rules.

That being said, it is not recommended to use static linkage for openssl if security updates need to be available for the end user without your involvement. Consider that for a moment what happens if you are gone, not working on this project anymore, etc.

Also, this setup is not tested frequently, so you may actually encounter some issues that should be fixed upstream, but this is solution design for the use case in question.

Disclaimer: since SO is about programming, I am ignoring the licensing consequences for static linking againt Qt, so I would just like to quickly remind that you that be aware of the proper usage not to get into legal troubles.

于 2014-01-11T21:59:10.860 回答
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_LFLAGSor LIBS。或者你可以试试这个帖子:如何添加“附加依赖项”(链接器设置)

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

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

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

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

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

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

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

于 2014-01-11T08:16:48.157 回答
1

这就是我使用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 正是这样做的。

将下面的内容放在qt5vars.batC:\Qt\qt5。如果需要,请进行调整:

@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使用:

于 2017-06-30T18:43:25.530 回答
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
于 2020-09-29T06:36:36.750 回答