4

我有带 MSVC 的 Qt 4.8.4(默认安装)。在我的应用程序中,我使用 ssl 连接到服务器。QtNetworkd4.dll 需要运行时 libeay32.dll 和 ssleay32.dll 如果我将这些库放在我的应用程序目录中,一切正常。

我试图将openssl库静态编译到我的应用程序中,虽然编译正常,但在启动应用程序期间抱怨未解析的符号,直到我将libeay32.dll和ssleay32.dll放入应用程序文件夹。

所以问题是:将这些库编译到我的应用程序中是真的吗,因为 QtNetwordkd4.dll 不会在我的应用程序二进制文件中查找所需的函数/符号,我宁愿用内置的 openssl 编译整个 Qt?像这样:

configure -openssl -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib\VC\static

或者我想要做的实际上是可行的,而我只是做错了什么,比如 libeay32 和 ssleay32 的错误版本等?

我试图用静态 openssl 编译有两个原因

  1. 我不必将 libeay32 和 ssleay32 放在我的应用程序目录中
  2. 恐怕在某些机器上可能已经安装了不同版本的 openssl,我的应用程序将与系统目录中的这些库进行交互。
4

3 回答 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"
于 2014-02-15T05:06:29.993 回答
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. 我看不出将 OpenSSL 库放在 Qt 库旁边有什么问题,尤其是在 Qt 的共享版本中;
  2. 由于在 OpenSSL 本身中发现的安全问题,在您的应用程序中升级 OpenSSL 变得更重(新的“巨大”应用程序二进制文件,而不仅仅是替换 OpenSSL DLL)。
于 2014-01-11T21:56:59.263 回答
0

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

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

于 2013-07-09T18:54:00.443 回答