OGeek|极客世界-中国程序员成长平台

标题: android - 使用具有不同 OpenSSL 版本的 Qt 网络功能 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 08:53
标题: android - 使用具有不同 OpenSSL 版本的 Qt 网络功能

我有兴趣在一些使用我自己编译的 OpenSSL 的应用程序中使用 Qt 的网络功能,这些功能包含在网络模块中。我想在 osx、ios 和 android 中使用这个应用程序。实现这一目标的正确方法是什么?从 qt 网站安装 Qt5 二进制文件后,我能够部署到 Android 和 OSX,但无法部署到 iOS。为了更改 iOS 工具包,我创建了一个环境变量 OPENSSL_LIBS 并将其设置为我的 iOS openssl 编译,但我无法让编译链接到该版本(它一直链接到我系统安装的 OpenSSL)。

论坛中有人说我需要使用 openssl-linked 配置选项编译 Qt,但我也无法让它工作。有人可以指导如何处理这些事情:使用二进制 Qt5 安装链接到不同的 OpenSSL 版本,或者从链接到不同版本的 OpenSSL 的源代码编译 Qt5。



Best Answer-推荐答案


I would like to use this application in osx, ios, and android. What is the proper way to make this happen?

Mac OS X 和 iOS 是问题 child 。 Apple 工具的问题是: 1) 链接器不支持 rpath-Bstatic 之类的东西;和 2) 链接编辑器不支持 rpathLD_PRELOAD

对于 (1),链接器将静默删除 rpath。此外,-Bstatic 被简单地忽略。因此,如果可用,您将始终链接到共享对象或 dylib,并且它可能会是错误的。

在 Mac OS X 上链接 OpenSSL 时,您很可能会获得系统 dylib 之一:

$ find /usr/ -iname libssl*
/usr//lib/libssl.0.9.7.dylib
/usr//lib/libssl.0.9.8.dylib
/usr//lib/libssl.dylib

对于 (2),链接编辑器没有 rpath 并且不支持 LD_PRELOAD,因此您将再次链接到系统库。

症状通常是模糊的失败,因为程序是针对例如 OpenSSL 1.0.1 编译的,而它在运行时链接到 0.9.8。数据结构有时会有所不同,因此您会遇到毫无意义的模糊崩溃。这是我所说的一个完美的例子:Coredump when compiling python with a custom openssl version .

解决方法是省略-L-lssl-lcrypto。相反,您应该指定文件的完整路径。例如,在 Mac OS X 上,我必须指定 /usr/local/ssl/lib/libssl.a/usr/local/ssl/lib/libcrypto.a.

静态存档只是 *.o 文件的集合。您应该尝试在“附加对象文件”中指定存档路径。如果不能,请尝试将它们添加到其他库中。在Makefile项目、Eclipse项目和Xcode项目中我都知道怎么做,但是在QtCreator下不知道怎么做。但是 Laszlo Papp 在 Adding object (.o) files to qtcreator project 上告诉您如何操作。 .

下面是 Xcode 下的一个类似示例,我链接的是 Crypto++ 而不是 OpenSSL。但是,请注意我指定了存档的完整路径。 (这是一个 Xcode 项目,我在设备上遇到错误,因为它无法加载 Crypto++ 共享对象)。

enter image description here

您还必须确保根据您的 OpenSSL 版本编译和链接其他依赖于 OpenSSL 的库。我通常采用相同的方法 - 针对静态存档编译依赖库(即使这意味着代码膨胀)。例如,我有一个链接到我的静态版本 OpenSSL 的 libevent 项目;我的项目链接到我的静态版本的 OpenSSL。这很糟糕,但在 Apple 修复损坏的链接器之前,您必须这样做。

Linux 的表现要好得多,您可以使用 rpathLD_PRELOAD。但是,既然您是在为 Apple 跳槽,那么您不妨到处做同样的事情。

无论您做什么,请勿在 Apple 平台上使用 -L-lssl-lcrypto。 Xcode 永远不会正确,即使在您假设使用的唯一库是静态存档的 iOS 上也是如此。显然 Xcode 开发人员没有收到备忘录,Apple QA 也没有测试(什么是新的)。

关于android - 使用具有不同 OpenSSL 版本的 Qt 网络功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22600874/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4