After update to Xcode 5 – ld: symbol(s) not found for architecture armv7 or armv7s linker error-Collection of common programming errors
Short answer:
- Remove Build Active Architecture Only (build setting parameter key is ‘ONLY_ACTIVE_ARCH’) from all of your static libraries’ project build settings or overwrite it with ‘NO’ like in the screenshot below:
Detailed answer:
The problem is that your static library ‘libCordova.a’ which you’re linking in your main app is only compiled for one architecture (armv7, but not armv7s).
You’ve probably let Xcode perform all the recommended changes for your static libraries project without reading what these changes actually are. Speaking for myself, I’ve never bothered to take a closer look at that info dialog (screenshot below), when I switched over to a new version of Xcode — until now.
The problem is that performing these changes activates for debug builds a new feature called Build Active Architecture Only (build setting parameter key is ‘ONLY_ACTIVE_ARCH’). In principle, this is a very cool enhancement of Xcode, because setting this to YES leads to faster building times, as Xcode only compiles the architecture of the connected device you’ve currently selected at the top when you hit the run button.
However, when blindly accepting this new parameter in a static library, you may run into this bug. The bug occurs when you’ve built the debug version of a static library while having connected an armv7 device, and then, when you’re debugging your main application, you’ve connected an armv7s device (or vice versa). Subsequently you’ll get the error above (or a similar one).
So my recommendation is to completely remove the value at project level for Build Active Architecture Only from all of your static libraries’ project build settings. Because if you take a look at the iOS default, it is NO. Of course you can also overwrite the setting to ‘NO’ to be sure the setting is correct even if in the future the default value will change (cf. 1st screenshot).