应用程序在 iOS 6 上崩溃:找不到符号:___sync_fetch_and_add_4



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

使用 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 的 iOS。静态库也是如此,您需要重建这些库。另外,请确保从 Archs 中删除 armv6 并添加 armv7,如果它不存在。

升级到 Xcode 4.5 后,我尝试了 2 天的所有内容,但没有任何效果。 我最终放弃了,重新开始使用Xcode 4.2.1

open -a/Developer/Applications/Xcode.app

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

实际上没有必要

降级到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"

这些库应该成功地链接在一起,那么你应该很高兴!

最新更新