在Qt应用程序中编译OpenSSL

4
我有一个默认安装的带MSVC的Qt 4.8.4版本。我的应用程序需要使用SSL连接服务器。 QtNetworkd4.dll需要运行时libeay32.dll和ssleay32.dll库。如果我将这些库放在我的应用程序目录中,一切都能正常工作。
我尝试将openssl库静态编译到我的应用程序中,虽然编译结果良好,但是启动应用程序时会报告未解决的符号,直到我将libeay32.dll和ssleay32.dll放置在应用程序文件夹中。
所以问题是: 是否明确这些库被编入我的应用程序没有任何用处,因为QtNetwordkd4.dll不会在我的应用程序二进制文件中查找所需的函数/符号,我应该编译整个Qt并内置openssl吗?就像这样:
configure -openssl -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib\VC\static

或者说我正在尝试做的事情是可行的,只是我做错了什么,比如使用错误版本的libeay32和ssleay32等等?
我正在尝试使用静态openssl编译,有两个原因:
1. 我不需要将libeay32和ssleay32放在我的应用程序目录中。
2. 我担心在某些计算机上已经安装了不同版本的openssl,我的应用程序将与这些位于系统目录的库进行交互。

重新编译QT并加入-openssl选项是可行的吗? - Lorenzo Dematté
1
Qt通常会对ssl库进行LoadLibrary/dlopen操作,因此静态链接无法解决问题。我认为有一个-openssl-linked选项,但不确定它是否适用于Windows。如果DLL文件与二进制文件紧密相邻,则第2个问题不是问题。请参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#standard_search_order_for_desktop_applications。 - Frank Osterfeld
我已经检查了来自 MSDN 的链接,在启用和禁用 SafeDllSearchMode 的两种情况下,搜索 DLL 的第一个位置是应用程序加载的目录。这是否意味着我可以确保我放置在我的应用程序目录中的 DLL 首先被加载? - user2018761
关于-openssl和-openssl-linked,这两个选项在Windows上都是可用的,但设置-openssl-linked不会创建带有内置openssl的二进制文件,而是需要Qt每次使用QtNetwork时都存在openssl库,据我所知。 - user2018761
3个回答

2
尝试如下操作:

像这样:

-openssl -openssl-linked -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib\VC\static  OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_DEBUG="-lssleay32MDd -llibeay32MDd" OPENSSL_LIBS_RELEASE="-lssleay32MD -llibeay32MD"

1
在编译Qt时,您可以根据configure命令行选择以下选项之一:
  1. 无OpenSSL支持(-no-openssl
  2. QtNetwork动态打开OpenSSL库(-openssl; 默认值)
  3. QtNetwork链接到OpenSSL(-openssl-linked

最后一个选项意味着动态链接(如果将Qt构建为共享库),或静态链接(当进行Qt的静态构建时,即-static)。

因此,“”解决方案“”是将-static -openssl-linked传递给Qt的configure


我称之为“解决方案”,因为:
  1. 我认为,在Qt的共享构建中,将OpenSSL库与Qt库一起发布并没有问题;
  2. 由于OpenSSL自身存在安全问题而升级应用程序中的OpenSSL会使应用程序变得更重(需要替换OpenSSL DLL文件,导致新的“巨大”应用程序二进制文件)。

0

正确的做法是将OpenSSL静态编译到您的应用程序中是无效的,因为QtNetwork4.dll期望函数在openssl DLL中而不是在您的应用程序中。

您有两个选择,一是将OpenSSL编译到Qt中,二是将libeay32和ssleay32与您的应用程序一起分发。或者,您可以要求用户自行安装这些DLL,但版本不匹配可能会带来问题(0.9.x和1.x版本之间存在一些重大差异)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接