有没有什么办法来建立静态Qt的静态OpenSSL的?有没有什么办法来建立静态Qt的静态OpenSSL

2019-05-12 06:43发布

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

我想建立的Qt 5.2在Windows静态OpenSSL的静态。

我的最终目标是推出一款单一的二进制 ,而不需要提供的libeay32.dll和与它ssleay32.dll。 然而,在我看来,这是不可能的。 我内置静态Qt的静态的OpenSSL库,但它似乎像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"

Answer 1:

有没有什么办法来建立静态Qt的静态OpenSSL的?

当然,你需要使用下面的选项配置Qt的时候:

-openssl-linked

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

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

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

另外,这个设置是不是经常测试,所以你实际上可能遇到的一些问题应上游固定的,但是这是解决方案设计为使用情况的问题。

免责声明:既然这么大约是编程,我忽略了静态链接againt的Qt许可的后果,所以我只想赶快提醒大家,要注意正确使用不会陷入法律麻烦。



Answer 2:

OPENSSL_LIBS = “ - llibeay32 -lssleay32” ...

避免-l共(和-L-Wl,-Bstatic )。 该连接器有时会忽略静态链接(苹果公司)的要求,有时脚本修改它(我不能告诉你构建脚本有多少自咬我)。

相反,使用指定完整的档案,就像你使用一个对象文件。 在您的LDLIBS添加下面,所以没有机会脚本搞砸或忽略你的要求的链接:

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

很显然,你应该改变的路径libssl.alibcrypto.a来匹配您的安装。

如果你没有一个LDLIBS ,然后将其添加到LDFLAGS (或IDE中的“其他连接标志”)。

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

同样的伎俩适用于共享对象,太(但接头有利于共享对象,因此通常不会成为一个问题)。 也就是说,你可以指定:

/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有能力图书馆是你调用一个FIPS_mode_set上。

您也可以从位置删除(或重命名)的共享对象,只留下静态存档。 我有Xcode的下建立的iPhone何时使用这一技术在过去。 Xcode中拒绝使用静态档案,即使是妥善安置-Bstatic 。 (交叉编译器和改性工具链是一些最严重的,有时使用)。 我不认为你应该有修改安装目录,所以我一般不使用它的技术。

总之,离开任何机会,避免-l-L ,和-Wl,-Bstatic 。 完全指定你想要什么,并使用完全合格的库路径名,并使用他们喜欢的对象文件。 使用rpath ,如果你指定一个共享对象。



Answer 3:

这是我建立的Qt 5.7.1在Windows上使用MSVC 2013 SSL支持:

  • 下载并安装: Perl版本5.12或更高版本
  • 下载并安装: Python版本2.7或更高版本
  • 下载并安装: 红宝石版本1.9.3或更高版本

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

  • 下载并安装: Win32的OpenSSL的v1.0.2L

从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 Creator中检测到这种全新的Qt版本创建你的项目一个新的工具包使用的问题:



文章来源: Is there any way to building static Qt with static OpenSSL?