iOS 6上的应用程序崩溃:未找到符号:___ sync_fetch_and_add_4

时间:2012-09-19 18:47:10

标签: ios xcode g++ atomic zeromq

我的应用程序与iOS4和iOS5完美配合。它使用静态编译的zeromq库版本,针对ARM。 Apple拒绝了我的应用程序,因为他们声称它在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编译器中禁用原子内置函数来试图完全绕过这个问题?

3 个答案:

答案 0 :(得分:0)

确保您没有定位任何低于4.3的iOS。您的静态库也是如此,您需要重建这些库。此外,确保从Archs中移除armv6并添加armv7s它是否不存在。

答案 1 :(得分:0)

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

  

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

只是澄清一下。我通过使用iOS 5 SDK构建iOS 6上的应用程序。所以,除非你立即需要iOS 6功能,否则它会起作用。

答案 2 :(得分: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”

图书馆应该成功连接在一起,然后你应该好好去!