android - 将 Qt 网络功能与不同 OpenSSL 版本一起使用

标签 android ios macos qt openssl

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

论坛中有人说我需要使用 openssl 链接的配置选项来编译 Qt,但我也无法使其正常工作。有人可以指导如何继续执行以下任一操作:通过二进制 Qt5 安装链接到不同的 OpenSSL 版本,或者从链接到不同版本的 OpenSSL 的源代码编译 Qt5。

最佳答案

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 是问题所在。 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 版本进行编译和链接。我通常采用相同的方法 - 针对静态存档编译依赖库(即使这意味着代码膨胀)。例如,我有一个 libevent 项目,它链接到我的静态版本的 OpenSSL;我的项目链接到我的静态版本的 OpenSSL。这很糟糕,但在 Apple 修复损坏的链接器之前,这是你必须做的。

Linux 的表现要好得多,您可以使用 rpathLD_PRELOAD。然而,既然你是在为苹果公司做事,那你不妨在任何地方都做同样的事情。

无论您做什么,请勿在 Apple 平台上使用 -L-lssl-lcrypto。 Xcode 永远不会做对,即使在 iOS 上,你应该使用的唯一库是静态文件。显然 Xcode 开发人员没有收到备忘录,Apple QA 也没有测试东西(新内容)。

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

相关文章:

ios - UIAlertController 在关闭 WiFi 时出错

java - Android WebView刷新页面并显示Toast [HW]

android - 在 Play 商店中发布后,Google 身份验证不起作用

iOS 5.0 sendEvent 调用了两 [2] 次

macos - 在 Mac OS X 上为透明代理设置端口转发时遇到问题

cocoa - 从可执行文件中获取 Bundle 名称

objective-c - 同时 NSURL 下载

android - 我需要在用户进入布局时显示 "drawerlayout"

android - 如何从 SD 卡上传图像到 Facebook?

ios - 使用 NSPredicate 或正则表达式检查一个大字符串是否包含另一个字符串