我有一个与 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)
有没有办法禁用苹果编译器中的原子内置函数来尝试完全绕过这个问题?
确保您的目标不是任何低于 4.3 的 iOS。您的静态库也是如此,您将需要重建它们。另外,请确保从 Archs 中删除armv6并添加armv7s(如果它不存在)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)