关于在qt应用程序中编译openssl

时间:2013-01-28 16:11:08

标签: qt static openssl

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

我试图将openssl libs静态编译到我的应用程序中,虽然编译很顺利,在启动应用程序期间抱怨未解析的符号,直到我将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放在我的app dir
  2. 我担心在某些机器上可能已经安装了不同版本的openssl,我的应用程序将从系统目录中与这些库进行交互。

3 个答案:

答案 0 :(得分: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 :(得分:0)

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

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

答案 2 :(得分:0)

编译Qt时,您可以根据configure命令行选择其中一个选项:

  1. 没有OpenSSL支持(-no-openssl
  2. QtNetwork动态打开OpenSSL库(-openssl;默认)
  3. QtNetwork链接到OpenSSL(-openssl-linked
  4. 最后一个意味着动态链接(如果Qt构建为共享库)或静态链接(当进行Qt的静态构建时,即-static)。

    因此问题的“解决方案”正在将-static -openssl-linked传递给Qt的configure


    我说“”解决方案“”因为

    1. 我没有看到在Qt旁边发布OpenSSL库时会出现什么问题,尤其是在Qt的共享版本中;
    2. 由于在OpenSSL中发现的安全问题,
    3. 在您的应用中升级OpenSSL变得更重(新的“巨大的”应用二进制文件,而不仅仅是替换OpenSSL DLL)。