我的应用程序与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编译器中禁用原子内置函数来试图完全绕过这个问题?
答案 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中使用它们的文档,但发现最简单的方法是:
图书馆应该成功连接在一起,然后你应该好好去!