2

我有一个与 iOS4 和 iOS5 完美配合的应用程序。它使用针对 ARM 的 zeromq 库的静态编译版本。Apple 拒绝了我的应用程序,因为他们声称它在 iOS 6 下崩溃(尚未发布..wth?)

在使用 iOS 6 GM 进行尝试后,我可以确认它在我们初始化 ZeroMQ 套接字时确实崩溃了。这是崩溃消息:

dyld: lazy symbol binding failed: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib

我了解 __sync_fetch_add_4 符号是编译器原子内置。我知道 ZeroMQ 正在使用互斥锁进行内部锁定。我一直在到处寻找,试图找出 iOS6 中可能导致这些符号不存在的变化。

使用 Xcode 4.5 和 iOS6 GM,库甚至不会使用相同类型的消息进行编译:

Undefined symbols for architecture armv7:
  "___sync_fetch_and_add_4", referenced from:
      zmq::socket_base_t::unregister_session(std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> > const&)in libzmq.a(libzmq_la-socket_base.o)

有没有办法在 Apple 编译器中禁用原子内置函数以尝试完全绕过这个问题?

4

3 回答 3

0

确实没有必要降级到早期版本的 iOS。我认为关键是使用可用于 C 和目标 C 开发的额外绑定:

http://czmq.zeromq.org/ http://www.zeromq.org/bindings:objc

我使用了 czmq 并且可以在 iOS 6 项目中使用 xcode 确认这些构建。我花了一些时间试图让这些工作,因为没有太多关于将它们与 iOS SDK 一起使用的文档,但发现最简单的方法是:

  • 从http://download.zeromq.org/zeromq-3.2.2.tar.gz下载 zeromq ,从命令行解压、配置和构建。
  • 从上面的链接下载 czmq 并解压。
  • 将上面的 src 和包含路径导入到 xcode 项目中。
  • 将 -lstdc++ 添加到目标项目的“构建设置”下的“其他链接器标志”部分
  • 导入“czmq.h”

图书馆应该成功链接在一起,那么你应该很高兴!

于 2013-03-11T11:59:39.947 回答
0

升级到 Xcode 4.5 后,我尝试了 2 天,但没有任何效果。我终于放弃并重新使用 Xcode 4.2.1

打开 -a /Developer/Applications/Xcode.app

只是为了澄清。通过使用 iOS 5 SDK 构建,我在 iOS 6 上运行了我的应用程序。因此,除非您立即需要 iOS 6 功能,否则它可以工作。

于 2012-10-20T00:08:41.473 回答
0

确保您没有针对任何低于 4.3 的 iOS。您的静态库也是如此,您将需要重建这些库。另外,请确保从 Archs 中删除 armv6 并添加 armv7s(如果它不存在)。

于 2012-09-19T18:56:36.263 回答