我感兴趣的是在一些使用我自己编译的OpenSSL的应用程序中使用随网络模块包括的Qt的网络功能。我想在osx,ios和android中使用这个应用程序。怎样才能做到这一点呢?通过qt网站上的Qt5二进制安装,我能够同时部署到安卓和OSX,但我无法部署到iOS。为了更改iOS工具包,我创建了一个环境变量OPENSSL_LIBS并将其设置为我的iOS openssl编译,但是我无法获得该编译链接到该版本(它一直链接到我的系统安装的OpenSSL)。
论坛上有人说我需要用openssl链接的配置选项编译Qt,但我也没能做到这一点。有人可以指导如何处理以下两种方法:用二进制OpenSSL安装链接到不同的Qt5版本,或者从链接到不同版本的OpenSSL的源代码编译Qt5。
发布于 2014-03-24 05:14:45
我想在osx,ios和android中使用这个应用程序。怎样才能做到这一点呢?
Mac和iOS是问题的孩子。苹果工具的问题是: 1)链接器不尊重rpath
和-Bstatic
这样的东西;2)链接编辑器不尊重rpath
和LD_PRELOAD
。
对于(1),链接器将悄悄地删除rpath
。此外,-Bstatic
被简单地忽略了。因此,如果可用,您将始终链接到共享对象或dylib,并且它可能是错误的。
当在Mac上链接到OpenSSL时,您很可能会得到一个系统dylibs:
$ 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上,我必须指定/usr/local/ssl/lib/libssl.a
和/usr/local/ssl/lib/libcrypto.a
。
静态档案只是*.o
文件的集合。您应该尝试在“其他对象文件”中指定归档路径。如果你做不到,那就试着把它们添加到额外的库中。我知道如何在Makefile项目、Eclipse和Xcode项目中这样做,但我不知道如何在QtCreator下这样做。但是拉兹洛·帕普告诉你如何在Adding object (.o) files to qtcreator project做这件事。
下面是Xcode下的一个类似的例子,我是针对Crypto++而不是OpenSSL链接的。但是,请注意,我指定了存档的完整路径。(这是一个Xcode项目,我在设备上发现了错误,因为它无法加载Crypto++共享对象)。
您还必须确保根据您的OpenSSL版本编译并链接其他依赖于OpenSSL的库。我通常采用相同的方法--根据静态存档编译依赖库(即使这意味着代码膨胀)。例如,我有一个libevent
项目,它链接到我的静态版本的OpenSSL;我的项目链接到我的静态版本的OpenSSL。这很糟糕,但这是你必须做的,直到苹果修复坏掉的链接器。
Linux的性能要好得多,您可以使用rpath
或LD_PRELOAD
。然而,由于你是跳槽苹果,你也可以做同样的事情在任何地方。
无论你做什么,都不会在苹果平台上使用-L
、-lssl
和-lcrypto
。Xcode永远不会正确,即使在iOS上,您应该使用的惟一库是静态存档。显然,Xcode开发人员没有收到备忘录,Apple QA也没有测试(什么是新的)。
https://stackoverflow.com/questions/22600874
复制相似问题