问题
I have an application that works perfectly with iOS4 and iOS5. It uses a statically compiled version of the zeromq library, targeted for ARM. Apple denied my application because they claim it crashes under iOS 6 (yet unreleased..wth?)
After trying it with the iOS 6 GM I can confirm it does crash when we initialize the ZeroMQ socket. Here is the crash messages:
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
I understand the __sync_fetch_add_4 symbol is a compiler atomic builtin. I know that ZeroMQ is using mutexes for it's internal locking. I have been searching everywhere to try to figure out what changed in iOS6 that could cause these symbols not to be present.
Using Xcode 4.5 and iOS6 GM, the library will not even compile with the same type of message:
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)
Is there a way to disable atomic builtins in the Apple compilers to try to bypass this problem altogether?
回答1:
Make sure you aren't targeting any iOS below 4.3. Same goes for your static library, you will need to rebuild these. Also, make sure to remove armv6 from Archs and add armv7s is it does not exist.
回答2:
After upgrading to Xcode 4.5, I tried everything for 2 days, and nothing worked. I finally gave up and went back to using Xcode 4.2.1
open -a /Developer/Applications/Xcode.app
Just to clarify. I've run my app on iOS 6 by building using the iOS 5 SDK. so unless you need iOS 6 functionality immediately, that works.
回答3:
It shouldn't really be necessary to downgrade to an early version of iOS. I think the key is to use the extra bindings that are available for C and objective C development:
http://czmq.zeromq.org/ http://www.zeromq.org/bindings:objc
I used the czmq ones and can confirm these build with xcode in an iOS 6 project. I spent some time trying to get these to work as there's not much documentation on using them with iOS SDKs, but found the easiest method was to:
- Download zeromq from http://download.zeromq.org/zeromq-3.2.2.tar.gz, extract, configure and build from the command line.
- Download czmq from the link above and extract.
- Import the src and include paths from the above into an xcode project.
- Add -lstdc++ to the 'Other Linker Flags' section under 'Build Settings' for your target project
- Import "czmq.h"
The libraries should successfully link together, then you should be good to go!
来源:https://stackoverflow.com/questions/12500966/app-crashes-on-ios-6-symbol-not-found-sync-fetch-and-add-4