【问题标题】:about compiling openssl inside qt application关于在 qt 应用程序中编译 openssl
【发布时间】:2013-01-12 00:54:49
【问题描述】:

我有带有 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,我的应用程序将与系统目录中的这些库进行交互。

【问题讨论】:

  • 是否可以选择使用 -openssl 重新编译 QT?
  • Qt 通常对 ssl 库执行 LoadLibrary/dlopen,因此静态链接无济于事。我认为有-openssl-linked,不确定它是否适用于Windows。 2. 如果 DLL 就在二进制文件旁边,这不是问题。见msdn.microsoft.com/en-us/library/windows/desktop/…
  • 我检查了来自 msdn 的链接,在启用和禁用 SafeDllSearchMode 两种情况下,首先搜索 dll 的位置是加载应用程序的目录。这是否意味着我可以确保我放置在我的应用程序目录中的 dll 会首先加载?
  • 关于 -openssl 和 -openssl-linked 这两个选项在 Windows 上都可用,但设置 -openssl-linked 不会创建内置 openssl 的二进制文件,而是要求 Qt 在每个选项中都有 openssl 库据我所知,使用 QtNetwork 的时间。

标签: qt static openssl


【解决方案1】:

试试这样:

-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"

【讨论】:

    【解决方案2】:

    编译 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)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多