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 问题?的主要内容,如果未能解决你的问题,请参考以下文章
更换Qt QtEmbedded库的版本出现问题及解决(交叉编译OpenSSL)