我有一个与iOS4和iOS5完美配合的应用程序。它使用针对ARM的zeromq库的静态编译版本。苹果否认我的应用程序,因为他们声称它在iOS 6下崩溃(但尚未发布..wth?)iOS 6上的应用程序崩溃:找不到符号:___sync_fetch_and_add_4
尝试使用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)
有没有一种方法来禁用苹果编译器原子建宏,试图完全绕过这个问题?
也许在编译器标志中加入'-fno-builtins'或'-fno-builtin-functions'? – 2012-09-19 18:48:39
苹果告诉开发者一段时间后提交与iOS6兼容的应用程序,因此他们说它在iOS6中崩溃的原因。 – WrightsCS
我试过-fno-builtin和其他人,但它似乎这些原子builins是不一样的(sync_前缀) –