xcode 5.1: libCordova.a architecture problems
Yesterday (3/10/14) when iOS 7.1 was released I also upgraded to Xcode 5.1 and found that my PhoneGap/Cordova project would no longer compile to my iPhone 5s. I also upgraded Cordova to the most recent release: v 3.4.0-0.1.3.
I have read many different solutions on SO that relate so changing active architectures and building only active architectures, and none of them work. So here's what I've tried and the errors I get. Initially I got the error:
missing required architecture arm64 in file <long file path omitted> libCordova.a
Undefined symbols for architecture arm64
So I tried the following. I selected the CordovaLib sub-project in my project, and in both the project and target, I went to Build Settings under Architectures and made sure that arm64
was not included in any of the Debug or Release architectures. At this time Build Active Architecture Only is set to "Yes". That resulted in the following error:
file was built for archive which is not the architecture being linked (armv7):
<long file path omitted> libCordova.a
Undefined symbols for architecture armv7
Setting Build Active Architecture Only to "No", the error again becomes:
missing required architecture arm64 in file <long file path omitted> libCordova.a
Undefined symbols for architecture arm64
I'm not sure what else to try. The project's architecture settings only includes the key "Base SDK" which is set to iOS 7.1. The project's target does not have architectures settings. Anyway I'm fairly certain the problem lies with the embedded CordovaLib sub-project. What can I do to make this thing compile to my device successfully?
Update: same issue on Apache's Jira: https://issues.apache.org/jira/browse/CB-6223
Solution 1:
@Shazron posted the fix on the Apache JIRA - he notes that the fix will be released as part of Cordova 3.5:
- Select your Project icon
- Choose Build Settings.
- For "Architectures", select $ARCHS_STANDARD - Standard architectures (armv7, armv7s, arm64)
- For "Valid Architectures", add "arm64"
- Select your CordovaLib.xcodeproj icon
- In the Build Settings for the Project (not Target), delete the conditional architecture settings (hover to see the minus sign)
- For "Architectures", select $ARCHS_STANDARD - Standard architectures (armv7, armv7s, arm64)
- For "Valid Architectures", add "arm64"
- Goto 6, but now do it for "Target"
Here's a link to Shazron's complete writeup of this problem: http://shazronatadobe.wordpress.com/2014/03/12/xcode-5-1-and-cordova-ios/
It is now released and the short version of what to do is:
Cordova CLI 3.4.1-0.1.0 is out, which includes Cordova iOS 3.4.1 which incorporates all the fixes mentioned in this blog post. Update your Cordova CLI, and if you have an existing project, do a “cordova platform update ios“.
Solution 2:
Another approach that works:
- Click on your project at the top of the project navigator (not the Cordova.lib subproject).
- In the editor pane, select the project (not the target), select the Build Settings editor tab, and click the All and Levels buttons.
- Expand the Architectures group if necessary and find the Architectures row under it.
- The first (resolved) and third (iOS Default) columns in the Architecture row will say Standard; the second (project) column will be blank.
- Click on the blank second column to bring up a box that will have one line, “$(ARCHS_STANDARD)”.
- Double-click that line to make it editable, then change it to read “$(ARCHS_STANDARD_32_BIT)”.
- Click outside the box to confirm your change. Now the first and second boxes will just have a $ in them.
- Now you should be able to build.
Solution 3:
Downgrade Xcode 5.1 to 5.0.2 worked for me, I could not wait for an official Cordova 3.5 release with the fix.
You can get a copy of the previous version here: https://developer.apple.com/downloads/index.action
Solution 4:
They just released a new version 3.4.1 that address this issues.
Therefore I update a single file to point to the TAG 3.4.1:
/usr/local/lib/node_modules/cordova/platforms.js
line 24 from:
version: '3.4.0'
to:
version: '3.4.1'
Then you remove the iOS folder in your project and run:
cordova platform add ios
This will download the new template based on 3.4.1 with all the patches.