In Xcode 6.1 , I am getting error for iPhone 6, iPhone 5s(iOS 7.1) which says
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_ClientAuthenticator", referenced from: objc-class-ref in AppDelegate.old: symbol(s) not found for architecture x86_64linker command failed with exit code 1This is what I have for architecture settings perspective
Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD) Base SDK : Latest iOS(8.1) Valid Architectures: arm64, armv7, armv7s IOS Deployment Target: iOS 6.0Recently I updated my OS to Yosemite and Xcode from 6.0 to 6.1. I have searched on Stack Overflow for this question which refer to Xcode 5.1 and tried all the given solutions, but nothing has worked.
Update - I tried the changes as suggested in the answer, but I still keep getting the error which says "Missing required architecture X86_64" . On further investigation I found that the file ClientAuthenticator.o which is from my library is not getting built for X86_64 architecture and probably that is the issue? I am looking how it can be built for x86_64.
My new question iswhat is the difference between arm64 and x86_64? More of it seems like the difference between just the architecture manufacturer, but basic 64-bit architecture remains same.
- Are you using a static library or this error while compiling your own project only?raurora– raurora2014-10-24 17:15:02 +00:00CommentedOct 24, 2014 at 17:15
- So, you're using a third-party library, which does not support 64-bit version (referring to
ClientAuthenticator.m). Try removing arm64 from Target / Build Settings / Architectures / Valid Architectures and then compile? Screenshot -i.imgur.com/Rqwr97G.pngraurora– raurora2014-10-24 17:59:10 +00:00CommentedOct 24, 2014 at 17:59 - 1So, now you're asking the right question. I'll post an answer.raurora– raurora2014-10-24 18:41:14 +00:00CommentedOct 24, 2014 at 18:41
- 7
x86_64architecture is required for running the 64bit simulator.arm64architecture is required for running the 64bit device (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini with Retina display).boro– boro2015-01-17 17:17:36 +00:00CommentedJan 17, 2015 at 17:17
13 Answers13
The first thing you should make sure is that your static library has all architectures. When you do a
lipo -info myStaticLibrary.aon terminal - you should seearmv7 armv7s i386 x86_64 arm64architectures for your fat binary.To accomplish that, I am assuming that you're making a universal binary - add the following to your architecture settings of static library project -

- So, you can see that I have to manually set the
Standard architectures (including 64-bit) (armv7, armv7s, arm64)of the static library project.

- Alternatively, since the normal
$ARCHS_STANDARDnow includes 64-bit. You can also do$(ARCHS_STANDARD)andarmv7s. Checklipo -infowithout it, and you'll figure out the missing architectures. Here's the screenshot for all architectures -

For your reference implementation (project using static library). The default settings should work fine -

Update 12/03/14Xcode 6 Standard architectures exclude armv7s.
So,armv7s is not needed? Yes. It seems that the general differences between armv7 and armv7s instruction sets are minor. So if you choose not to include armv7s, the targeted armv7 machine code still runs fine on 32 bit A6 devices, and hardly one will notice performance gap.Source
If there is a smarter way for Xcode 6.1+ (iOS 8.1 and above) - please share.
14 Comments
$ARCHS_STANDARD now includes 64-bit. You can also do$(ARCHS_STANDARD) andarmv7s. Updating the answer.If you are building a universal library and need to support the Simulator (x86_64) then build the framework for all platforms by settingBuild Active Architecture Only toNo.
1 Comment
Many use the build scripts found either here:http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial or here:https://gist.github.com/sponno/7228256 for their run script in their target.
I was pulling my hair out trying to add x86_64, i386, armv7s, armv7, and arm64 to the Architectures section, only to findlipo -info targetname.a never returning these architectures after a successful build.
In my case, I had to modify the target runscript, specifically step 1 from the gist link, to manually include the architectures using -arch.
Step 1. Build Device and Simulator versionsxcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}"BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -arch x86_64 -arch i386 -arch armv7 -arch armv7s -arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
2 Comments
Build settings from command line message with -arch)-arch parameter didn't result in a successful build for some reason, despite setting the ARCHS variable successfully. However, definingARCHS='i386 x86_64' as part of the command itself fixed the issue for me.Here's a response to your latest question about the difference betweenx86_64 andarm64:
x86_64architecture is required for running the 64bit simulator.arm64architecture is required for running the 64bit device (iPhone5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini with Retinadisplay).
Comments
I run into exactly the same problem and was following this tutorialhttps://github.com/jverkoey/iOS-Framework#faq
The way that I made this work is after putting into the scripts into your Aggregate's Build Phase, before you compile, make sure you compile it using an iphone simulator (I used iPhone6) instead of IOS Device.
which will give me 2 slices: armv7 and x86_64, then drag and drop it into new project is working fine for me.
1 Comment
I uselipo command to combine two built static libraries manually.
EX: I have a static library(libXYZ.a) to build.
I run build forGeneric iOS Device and got Product inDebug-iphoneos/
$ lipo -info Debug-iphoneos/libXYZ.aArchitectures in the fat file: Debug-iphoneos/libXYZ.a are: armv7 arm64Then I run build for anyiOS Simulator and got Product inDebug-iphonesimulator/
$ lipo -info Debug-iphonesimulator/libXYZ.aArchitectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64Finally I combine into one to contain all architectures.
$ lipo -create Debug-iphoneos/libXYZ.a Debug-iphonesimulator/libXYZ.a -output libXYZ.a$ lipo -info libXYZ.aArchitectures in the fat file: libXYZ.a are: armv7 i386 x86_64 arm64Comments
My solution was connect my iPhone 6, build on it and I got the project running successfully.
Because I was building for iPhone 6 Simulator.
1 Comment
1 Comment
Comments
One other thing to look out for is that XCode is badly handling the library imports, and in many cases the solution is to find the imported file in your project, delete it in Finder or from the command line and add it back again, otherwise it won't get properly updated by XCode. By XCode leaving there the old file you keep running in circles not understanding why it is not compiling, missing the architecture etc.
Comments
If you are having this problem in react-native projects with one of the external library. You should remove the project and usereact-native link <package-name> again. That should solve the problem.
Comments
I tried using all the above, nothing worked in my case.
I used the SumUp library which was causing this issue.
I fixed it by:
- Removing the -ObjC parameters (all of them); in previous SumUp libs they required to have the -ObjC populated with parameters to make it work, however the latest version (xc v4.0.1 at the time of my answer here), the docs says remove it.
That still didn't fix the issue, I was still seeing errors all over the place hence coming to this thread,... however, after playing around with the settings the following fixed it:
- Going into "Build Settings" for your project and then changing "Build Active Architectures Only" to "YES", cleaned, Rebuilt, no errors, Finally!
Comments
Set in TARGETS -> MyProject -> User-Defined --> VALID_ARCHS those values: arm64 armv7 x86_64 solved this issue for me.
Comments
Explore related questions
See similar questions with these tags.








