首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么方法可以用静态OpenSSL构建静态Qt吗?

有什么方法可以用静态OpenSSL构建静态Qt吗?
EN

Stack Overflow用户
提问于 2013-12-30 16:11:51
回答 4查看 11.3K关注 0票数 17

最初的问题略有不同,但这是一个更重要问题的一部分。

我试图在Windows上使用静态OpenSSL将QT5.2构建为静态的。

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

的回答还表明,QtNetwork总是搜索DLL,忽略所有其他内容,但它也指出“两个选项是将OpenSSL编译成Qt.”但情况似乎并非如此。

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

这是我的Qt配置(为可读性添加的换行符):

代码语言:javascript
复制
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"
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-11 21:59:10

有什么方法可以用静态OpenSSL构建静态Qt吗?

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

代码语言:javascript
复制
-openssl-linked

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

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

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

而且,这个设置不是经常测试的,所以您实际上可能会遇到一些应该在上游修复的问题,但这是所讨论的用例的解决方案设计。

免责声明:既然编程也是如此,我就忽略了针对Qt的静态链接的许可后果,所以我想快速提醒您,注意正确的用法,以免陷入法律麻烦。

票数 13
EN

Stack Overflow用户

发布于 2014-01-11 08:16:48

OPENSSL_LIBS="-llibeay32 -lssleay32“

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

相反,使用完全指定的存档,就像使用对象文件一样。在您的LDLIBS中添加以下内容,这样脚本就没有机会把事情搞砸,或者链接器忽略您的请求:

代码语言:javascript
复制
/usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a

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

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

在Qt中,看起来应该是QMAKE_LFLAGSLIBS。或者你可以试试这个帖子:如何添加“附加依赖项”(链接器设置)

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

代码语言:javascript
复制
/usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so

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

代码语言:javascript
复制
-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

票数 1
EN

Stack Overflow用户

发布于 2017-06-30 18:43:25

这就是我如何使用MSVC 2013在Windows上使用SSL支持构建QT5.7.1

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

从github存储库下载Qt:

代码语言:javascript
复制
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中。如果您需要:

代码语言:javascript
复制
@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

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

代码语言:javascript
复制
qt5vars.bat 
perl init-repository

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

代码语言:javascript
复制
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版本,在您的项目中创建一个新的工具包

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20843180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档