qt linux 部署 - 网络 OpenSSL 问题?

Posted

技术标签:

【中文标题】qt linux 部署 - 网络 OpenSSL 问题?【英文标题】:qt linux deployment - Network OpenSSL problem? 【发布时间】:2020-07-21 22:36:27 【问题描述】:

我想将我写的申请发送给一些同事。 到目前为止,我只是将二进制文件与所有库一起复制到一个 .zip 文件中并将其发送给他们。 这工作得很好。

我的最新更改涉及我正在使用 Qt Network 库。因此,我在 .zip 文件中包含了三个新的库文件:

libQt5Network.so.5 libQt5Network.so.5.11 libQt5Network.so.5.11.1

应用程序启动并运行,但在某些时候,预计会从 Web 下载多个文件。 不幸的是,一些下载失败。可以从FTP 服务器下载文件,但不能从https 下载文件。

我假设它可能与 OpenSSL 丢失有关,但我不确定。 当我开始使用 Qt Network 库时,我记得我从https 下载它时遇到了问题,这些问题与OpenSSL 有关。

我没有下载文件,而是收到以下错误消息:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
We got a connection error when networkLayerState is Unknown
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
...

错误消息显然是指SSL 库。

请注意,我不相信我的代码在我的计算机上运行时存在问题。因此,我不会在这里发布代码。 我认为这与我部署代码的方式有关,并且缺少某些库?我能做些什么?

我尝试在可执行文件和libQt5Network.so.5 上运行ldd,但它没有列出与OpenSSL 相关的任何内容。

请注意,我不是计算机专家,我只是想将他的软件尽可能简单地分发给一些同事的科学家。

【问题讨论】:

【参考方案1】:

这里的问题你是对的 - QNetwork 需要 OpenSSL 才能工作

所以,你需要弄清楚一些事情来提供 OpenSSL 库

    默认情况下,Linux 链接到安装在系统中的库。因此,目标系统需要具有与您的版本完全相同的 QT 库和 OpenSSL。 大多数时候这是一个糟糕的解决方案,因为你不能保证库不会更新

    您可以帮助 Linux 找到具有 LD_LIBRARY_PATH 环境变量的库。使用此方法,您可以发送带有可执行文件的所需库,并使用 LD_LIBRARY_PATH 指向它们。您需要 shell 脚本才能舒适地运行应用程序。有关此方法和示例的更多信息,请参阅 QT docs

    使用库打包您的应用程序。您可以使用分发本机包管理器的格式。 DEB 和 RPM 包创建信息可以在QT wiki 上找到。或者您可以使用通用 AppImage 格式。使用 linuxdeployqt 变得非常简单,而且它适用于每个发行版,是我最喜欢的选择

前面指定的所有内容都适用于使用动态链接库的应用程序,这是构建应用程序的默认方式。对于静态构建的应用程序,您将不需要它,因为您的可执行文件中已经包含所有静态链接的库(QT docs)

【讨论】:

我正在使用选项 2。我的可执行文件由一个类似于您发送的链接中的 Creating the Application Package 点的 shell 脚本启动。但是,我不知道在哪里可以找到需要添加到文件夹中的正确 OpenSSL 库。通常,我只是使用ldd 来查找和复制它。一个月前我也尝试过使用linuxdeployqt 的选项 3,但请记住,它不适用于 Ubuntu 18.04,而且我没有安装 14.04 或 16.04。 是的,linuxdeployqt 需要 Ubuntu 16.04,我使用 docker (hub.docker.com/r/frostasm/qt)。 ldd 可以向您显示符号链接,但不要关注它们,它也不会向您显示 lib 的依赖关系 制作 OpenSSL 库的唯一方法可能是从 GitHub 获取兼容版本并自己构建它。 This问题可以帮助你安装libs并在系统中找到它 但是 OpenSSL 库必须在我的计算机上的某个位置,因为它在那里工作......我说的对吗?因此,如果我找到它,我可能会遵循它。或者我应该简单地再试一次linuxdeployqt,但我担心我可能无法再次正确安装所有东西...... 我使用的是 Ubuntu,我可以在 /usr/lib/x86_64-linux-gnu 中找到 libssl 库。你需要libssl-dev 包。

以上是关于qt linux 部署 - 网络 OpenSSL 问题?的主要内容,如果未能解决你的问题,请参考以下文章

openssl 和libcurl的安装

更换Qt QtEmbedded库的版本出现问题及解决(交叉编译OpenSSL)

qt串口静态搭建,qt app部署到所有linux系统

在 Linux 中正确部署 Qt 应用程序

Windows上部署Cygwin运行环境之---TAR/OPENSSL

Qt笔记-Centos7搭建OpenSSL开发环境及Qt调用OpenSSL实例