51

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 1

This 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.0

Recently 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.

Cœur's user avatar
Cœur
39k25 gold badges207 silver badges282 bronze badges
askedOct 24, 2014 at 17:09
yogsma's user avatar
12
  • Are you using a static library or this error while compiling your own project only?CommentedOct 24, 2014 at 17:15
  • Compiling my own projectCommentedOct 24, 2014 at 17:19
  • So, you're using a third-party library, which does not support 64-bit version (referring toClientAuthenticator.m). Try removing arm64 from Target / Build Settings / Architectures / Valid Architectures and then compile? Screenshot -i.imgur.com/Rqwr97G.pngCommentedOct 24, 2014 at 17:59
  • 1
    So, now you're asking the right question. I'll post an answer.CommentedOct 24, 2014 at 18:41
  • 7
    x86_64 architecture is required for running the 64bit simulator.arm64 architecture is required for running the 64bit device (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini with Retina display).CommentedJan 17, 2015 at 17:17

13 Answers13

54
  • The first thing you should make sure is that your static library has all architectures. When you do alipo -info myStaticLibrary.a on terminal - you should seearmv7 armv7s i386 x86_64 arm64 architectures 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 -

enter image description here

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

enter image description here

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

enter image description here

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

    enter image description here

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.

answeredOct 24, 2014 at 18:52
raurora's user avatar
Sign up to request clarification or add additional context in comments.

14 Comments

Why do you have to specify exclusively ARCHES_STANDARD_INCLUDING_64_BIT , when ARCHES_STANDARD should have 64 bit
@yogsma Good point. The normal$ARCHS_STANDARD now includes 64-bit. You can also do$(ARCHS_STANDARD) andarmv7s. Updating the answer.
@yogsma If this has answered your question, please accept the answer by clicking the check mark icon. This takes it off the "unanswered" list and increases the chance of people answering your future questions.
Thanks, I will, but it has not resolved my issue. I am pretty good at accepting answers if it resolves my issue, sometimes even when it does not. I am still working on it.
@yogsma Can you explain the nature of the issue? Just add it as an 'Update' to your question - showing what you did after following the above steps.
|
27

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.enter image description here

answeredApr 6, 2015 at 14:02
David Douglas's user avatar

1 Comment

This worked for me, but only after I set it to "No" for all targets, including frameworks.
11

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}"

answeredJun 11, 2015 at 19:38
joelc's user avatar

2 Comments

I think I'm encountering the same problem, but adding -arch for me causes the xcodebuild command to terminate silently without building anything (I'm dumping output of the above to /tmp, and I get to BUILD SUCCEEDED message without -arch, but don't get pastBuild settings from command line message with -arch)
Fixed, for me-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.
11

Here's a response to your latest question about the difference betweenx86_64 andarm64:

  • x86_64 architecture is required for running the 64bit simulator.

  • arm64 architecture is required for running the 64bit device (iPhone5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini with Retinadisplay).

answeredMar 24, 2016 at 10:14
boro's user avatar

Comments

4

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.

answeredDec 18, 2014 at 16:58

1 Comment

Went through a lot but this did the trick I just needed to build my framework with a simulator selected. Thanks!
4

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 arm64

Then 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_64

Finally 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 arm64
answeredApr 25, 2018 at 3:34
allen huang's user avatar

Comments

1

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.

answeredApr 10, 2018 at 1:18
JD - DC TECH's user avatar

1 Comment

do you have any idea why simulator failed this?
1

Setting the build active architectures only to No fixed this problem for me.enter image description here

answeredOct 27, 2018 at 2:30
Satyasree Muralidharan's user avatar

1 Comment

Where is this setting
0

Following changes you have to make that's it(change architecture into armv7 and remove others) :-

Change you have to make

answeredMay 17, 2016 at 9:14
shubham mishra's user avatar

Comments

0

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.

answeredFeb 19, 2018 at 14:56
BPH's user avatar

Comments

0

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.

answeredJul 21, 2018 at 23:22
Seraj Ahmad's user avatar

Comments

0

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:

  1. 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:

  1. Going into "Build Settings" for your project and then changing "Build Active Architectures Only" to "YES", cleaned, Rebuilt, no errors, Finally!
Nimantha's user avatar
Nimantha
6,5376 gold badges32 silver badges78 bronze badges
answeredFeb 6, 2021 at 7:20
Heider Sati's user avatar

Comments

0

Set in TARGETS -> MyProject -> User-Defined --> VALID_ARCHS those values: arm64 armv7 x86_64 solved this issue for me.

answeredDec 13, 2023 at 20:45
rudi Ladeon's user avatar

Comments

Your Answer

Sign up orlog in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

By clicking “Post Your Answer”, you agree to ourterms of service and acknowledge you have read ourprivacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.