最初的问题略有不同,但这是一个更重要问题的一部分。
我试图在Windows上使用静态OpenSSL将QT5.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"发布于 2014-01-11 21:59:10
有什么方法可以用静态OpenSSL构建静态Qt吗?
当然,在配置Qt时需要使用以下选项:
-openssl-linked原因是QtNetwork默认使用QLibrary类动态打开库以获取必要的符号。
这是告诉Qt不要这样做的选择,并尊重正常的链接规则。
尽管如此,如果需要在没有您参与的情况下为最终用户提供安全更新,则不建议为openssl使用静态链接。考虑一下,如果你离开了,不再从事这个项目,会发生什么,等等。
而且,这个设置不是经常测试的,所以您实际上可能会遇到一些应该在上游修复的问题,但这是所讨论的用例的解决方案设计。
免责声明:既然编程也是如此,我就忽略了针对Qt的静态链接的许可后果,所以我想快速提醒您,注意正确的用法,以免陷入法律麻烦。
发布于 2014-01-11 08:16:48
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。或者你可以试试这个帖子:如何添加“附加依赖项”(链接器设置)。
同样的技巧也适用于共享对象(但链接器更倾向于共享对象,因此它通常不会成为一个问题)。也就是说,您可以指定:
/usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so在指定像上面这样的共享对象时要记住的是,您必须指定一个rpath,以确保运行时链接器获得消息。也就是说,您应该向LDFLAGS或“其他链接器选项”添加以下内容:
-Wl,-rpath=/usr/local/ssl/lib在使用驻留在OpenSSL中的/usr/local/ssl/lib FIPS功能库时,我在指定共享对象时被咬了一些,因为运行时链接器在/usr/lib或/usr/lib64中使用发行版的OpenSSL。OpenSSL FIPS功能库就是您所调用的FIPS_mode_set库。
您还可以从位置移除(或重命名)共享对象,只留下静态存档。我过去在为iPhone构建Xcode时必须使用这种技术。Xcode拒绝使用静态存档,即使使用了正确放置的-Bstatic。(交叉编译器和修改后的工具链有时是最糟糕的)。我不认为您应该修改安装目录,所以我通常不使用它的技术。
总之,不要放过任何机会,避免-l、-L和-Wl,-Bstatic。完全指定您想要的内容,并使用完全限定的库路径名称,并像使用对象文件一样使用它们。如果指定共享对象,则使用rpath。
发布于 2017-06-30 18:43:25
这就是我如何使用MSVC 2013在Windows上使用SSL支持构建QT5.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.bat的C:\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配置为来检测这个新的Qt版本,和在您的项目中创建一个新的工具包:


https://stackoverflow.com/questions/20843180
复制相似问题