原始问题略有不同,但是是一个更重要问题的一部分。
我正在尝试使用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"
答案 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.a
和libcrypto.a
的路径以匹配您的安装。
如果您没有LDLIBS
,请将其添加到LDFLAGS
(或IDE中的“其他链接器标记”)。
在Qt中,它看起来像QMAKE_LFLAGS
或LIBS
。或者您可以尝试这篇文章: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)
从此处下载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