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

我有一个适用于iOS4和iOS5的应用程序。 它使用针对ARM的zeromq库的静态编译版本。 苹果否认我的申请,因为他们声称在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符号是一个编译器primefaces内置。 我知道ZeroMQ使用互斥体进行内部locking。 我一直在到处search,试图找出iOS6中可能导致这些符号不存在的变化。

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

 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编译器中禁用primefaces内置函数来试图绕过这个问题?

确保你没有针对4.3以下的任何iOS。 你的静态库也一样,你需要重build这些库。 此外,确保从Archs中移除armv6,并添加armv7s不存在。

升级到Xcode 4.5后,我试了两天,没有任何工作。 我终于放弃了,回到使用Xcode 4.2.1

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

只是为了澄清。 我已经使用iOS 5 SDK构build了iOS 6上的应用程序。 所以除非你立即需要iOS 6的function,否则工作。

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

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

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

图书馆应该成功地连接在一起,那么你应该好好去!

Interesting Posts