【问题标题】:OpenSSL compression on iOS DeviceiOS 设备上的 OpenSSL 压缩
【发布时间】:2014-04-01 20:08:00
【问题描述】:

我在我的 ios 项目中使用 openssl,因此我使用来自 github 的构建脚本构建了一个静态库:https://github.com/x2on/OpenSSL-for-iPhone。我在我的 xcode 项目中包含了 libcrypto.a 和 libssl.a,并且可以成功使用所有 openssl 函数。 现在我想用 openssl 支持压缩。问题:创建的库似乎不支持任何压缩方法(SSL_COMP_get_compression_methods() 为空)。

所以我添加了 zlib-dynamic 属性:

./Configure iphoneos-cross --openssldir="${CURRENTPATH}/bin/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" zlib-dynamic

我在链接中添加了 libz.dylib:

http://oi60.tinypic.com/2ljlqmb.jpg

现在压缩在模拟器中有效,但在设备上无效。据我所知,iOS 上不允许使用动态库。然而 libz.dylib 是一个系统库。 openssl 是否可以在设备上使用集成的 zlib?如果没有,是否可以在 iOS 设备上使用带有压缩功能的 openssl?

【问题讨论】:

    标签: ios xcode openssl static-libraries zlib


    【解决方案1】:

    你是对的,iOS 已经包含libz.dylib。因此,您应该能够链接到它:

    • 在“构建阶段”中删除您添加的 libz.dylib
    • 在“Build Settings”中找到名为“Other Linker Flags”的设置并添加-lz
    • 请注意,zlib.h 也可作为 iOS SDK 的一部分使用,因此无需另外提供。

    这应该允许为模拟器和设备构建您的应用程序。

    编辑

    以上并不能解决问题。实际问题是由zlib-dynamic OpenSSL Configure 引起的。使用此选项,OpenSSL 会尝试在运行时加载 libz.so(但未能这样做,因为它在 iOS 上被命名为 libz.dylib)。这很容易通过将zlib-dynamic 替换为zlib 并重新构建OpenSSL 来解决。如果使用新建的库导致链接器错误,请检查答案的第一部分。

    【讨论】:

    • 您的解决方案得到了相同的结果:我可以编译应用程序,它可以在模拟器和设备上运行,但压缩只能在模拟器中运行。有没有其他解决方案可以让压缩工作?也许用包含的 zlib 构建 openssl?
    • 抱歉,我一定是误读/误解了这个问题:我的印象是您遇到了设备的 build 错误。如果您没有看到构建/链接错误但运行时行为不同,那么我认为值得查看 OpenSSL Configure/make 日志。也许Configure 没有找到为设备构建启用libz 所需的东西。
    • 好的,我花了一些时间调查,看起来问题的根源在于zlib-dynamic 选项。将其替换为 zlib 即可。不要忘记链接到libz!我已经通过您链接到的脚本构建 OpenSSL 进行了验证。 zlib-dynamic 导致错误,因为 OpenSSL 无法在运行时打开 libz.so - 它在 iOS 上称为 libz.dylibzlib 将尝试在链接时解析符号(如果您不通过 -lz,则会导致链接错误)。此外,如果您只修改“iphone-cross”目标,那么 64 位模拟器将不支持 zlib。
    • 感谢您帮助我。我使用了 zlib no-shared no-zlib-dynamic 选项。压缩现在可以在模拟器和设备上运行。
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多