我有一个与 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 编译器中禁用原子内置函数以尝试完全绕过这个问题?