2012-09-19 56 views
2

我有一个与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) 

有没有一种方法来禁用苹果编译器原子建宏,试图完全绕过这个问题?

+0

也许在编译器标志中加入'-fno-builtins'或'-fno-builtin-functions'? – 2012-09-19 18:48:39

+0

苹果告诉开发者一段时间后提交与iOS6兼容的应用程序,因此他们说它在iOS6中崩溃的原因。 – WrightsCS

+0

我试过-fno-builtin和其他人,但它似乎这些原子builins是不一样的(sync_前缀) –

回答

0

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

0

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

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

只是为了澄清。我使用iOS 5 SDK构建了iOS 6上的应用程序。所以除非你立即需要iOS 6的功能,否则就可以。

0

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

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

我用czmq的人,可以确认这些建立在Xcode在iOS 6中的项目。我花了一些时间,试图得到尽可能没有太多的文件,这些工作使用它们与iOS的SDK,却发现最简单的方法是:

  • 下载zeromq从http://download.zeromq.org/zeromq-3.2.2.tar.gz,提取物,配置和命令行构建。
  • 从上面的链接下载czmq并解压缩。
  • 导入src并将上述路径包含到xcode项目中。
  • 添加-lstdC++到“其他链接器标记”部分中“构建设置”为目标的项目
  • 导入“czmq.h”

的图书馆应该成功联系在一起,那么你就应该好去!

+0

你正在使用zmq3。我的问题(我相信Benoit也是)我们仍在使用zmq2。 –

相关问题