原来的问题略有不同,但一个更重要的问题的一部分。
我想建立的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"
有没有什么办法来建立静态Qt的静态OpenSSL的?
当然,你需要使用下面的选项配置Qt的时候:
-openssl-linked
其原因是,QtNetwork使用QLibrary
默认类动态打开库,以获得必要的符号。
这是告诉Qt的不这样做,并尊重正常的联动规则的选项。
话虽这么说,不建议使用静态链接OpenSSL的,如果安全更新需要可用于没有你参与的最终用户。 考虑了一会儿,如果你走了,没有工作在这个项目上再发生什么,等等。
另外,这个设置是不是经常测试,所以你实际上可能遇到的一些问题应上游固定的,但是这是解决方案设计为使用情况的问题。
免责声明:既然这么大约是编程,我忽略了静态链接againt的Qt许可的后果,所以我只想赶快提醒大家,要注意正确使用不会陷入法律麻烦。
OPENSSL_LIBS = “ - llibeay32 -lssleay32” ...
避免-l
共(和-L
和-Wl,-Bstatic
)。 该连接器有时会忽略静态链接(苹果公司)的要求,有时脚本修改它(我不能告诉你构建脚本有多少自咬我)。
相反,使用指定完整的档案,就像你使用一个对象文件。 在您的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的时指定共享对象时FIPS驻留在能够在图书馆我已经被咬了几个/usr/local/ssl/lib
,因为运行时链接使用分配的OpenSSL的在/usr/lib
或/usr/lib64
。 OpenSSL的FIPS有能力图书馆是你调用一个FIPS_mode_set
上。
您也可以从位置删除(或重命名)的共享对象,只留下静态存档。 我有Xcode的下建立的iPhone何时使用这一技术在过去。 Xcode中拒绝使用静态档案,即使是妥善安置-Bstatic
。 (交叉编译器和改性工具链是一些最严重的,有时使用)。 我不认为你应该有修改安装目录,所以我一般不使用它的技术。
总之,离开任何机会,避免-l
, -L
,和-Wl,-Bstatic
。 完全指定你想要什么,并使用完全合格的库路径名,并使用他们喜欢的对象文件。 使用rpath
,如果你指定一个共享对象。
这是我建立的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版本和创建你的项目一个新的工具包使用的问题: