Xcode build failure "Undefined symbols for architecture x86_64"
Asked Answered
G

29

211

An Xcode beginner's question:

It is my first experience with Xcode 4.6.3.

I am trying to write a very simple console program, that searches for paired BT devices and prints them to an NSLog.

It builds with the following error:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I searched like crazy. The common problem should be a reference to a file, of which only the header files are imported and no implementation (*.m-file) is found by the linker. The IOBluetooth library is however, a standard Framework like the Foundation Framework.

What am I missing in my above statement?

I also have tried building it for a 32-bit machine (build fails again). It is clearly a linker error, however I have no idea, to what it relates, except that there is an issue with finding the implementation for IOBluetoothDevice, on both x86 and x64 architecture, while the header files are from a standard included Framework, called IOBluetooth?

For your information my main code "main.m" being:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

Thanks for any help or pointers to the right direction.

Gladysglagolitic answered 23/8, 2013 at 17:27 Comment(2)
Try to add $(inherited) to Other Linker Flags, clean and build.Odele
When I ran into this I found I had to go to File Inspector for the m file and check the box under Target Membership to export (?) it to the module where I was trying to use it.Deviant
Q
143

It looks like you are missing including the IOBluetooth.framework in your project. You can add it by:

  • Clicking on your project in the upper left of the left pane (the blue icon).

  • In the middle pane, click on the Build Phases tab.

  • Under "Link Binary With Libraries", click on the plus button.

  • Find the IOBluetooth.framework from the list and hit Add.

enter image description here

enter image description here

This will make sure that the IOBluetooth.framework definitions are found by the linker. You can see that the framework is a member of your target by clicking on the framework in the left pane and seeing the framework's target membership in the right pane (note I've moved the framework under the Frameworks group for organization purposes):

enter image description here

Quintilla answered 24/8, 2013 at 0:43 Comment(4)
The same thing works fine for oAuthIOS framework. Add oAuthIOS framework from pods folder to the root project you are trying to buildVegetable
I'm searching for IOBluetooth.framework, but it's not there :SGruel
That's odd, it should be there.Quintilla
I can't find IOBluetooth.framework , still stuck in there @ChrisLivdahlElizabetelizabeth
M
50

UPD

Apple requires to use arm64 architecture. Do not use x32 libraries in your project

So the answer below is not correct anymore!


Old answer

The new Xcode 5.1 sets the architecture armv7,armv7s,and arm64 as default.

And sometimes the error "build failure “Undefined symbols for architecture x86_64”" may be caused by this. Because, some libs (not Apple's) were compiled for x32 originally and doesn't support x64.

So what you need, is to change the "Architectures" for your project target like this

NB. If you're using Cocoapods - you should do the same for "Pods" target.

enter image description here

Miraculous answered 28/3, 2014 at 8:54 Comment(7)
Basically I removed the arm64 thingy from the Valid Architectures property. Then as shown in the above, it will be forced only to look what's there in the valid architectures I guess!Goulder
@Vishman, hi! There's a good SO answer that covers difference between Valid Architectures and Architectures.Miraculous
Fixed my linked errors in Xcode 5 when I was trying to run the project in iOS 7.1 simulator, in iOS 6.x simulator it worked fine by default, thx :)Stonemason
@BraveS : By removing arm64 architecture will it work for 64-bit device?Wootan
@JayprakashDubey, yes, that will work. But it is better to make your app with 64-bit support.Miraculous
@JayprakashDubey hi i uploaded a built in appstore with out 64bit support they rejected my app. When i am trying to add the arm64 i am facing an error build failure “Undefined symbols for architecture x86_64”. if i remove arm64 from architecture. and i put arm64 in valid architecture. Is my app is approved???Banshee
@Balu : If your app is approved then you will be notified. Uploading an app on iTunes Connect should be 64 bit architecture. Check this : developer.apple.com/news/?id=01192015aWootan
E
33

Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_xxx", referenced from: objc-class-ref in yyy.o

This generally means, you are calling "xxx" (it may be a framework or class) from the class "yyy". The compiler can not locate the "xxx" so this error occurs.

You need to add the missing files(in this case "xxx") by right click on your project folder in navigator window and tap on "Add files to "YourProjectName"" option.

A popup window will open your project files in Finder. There, you can see the missing files and just add them to your project. Don't forget to check the "Copy items if needed" box. Good luck!!

Ethereal answered 17/12, 2015 at 8:25 Comment(1)
What about CocoaPods, shouldn't be already included when installing (#65904502)?Cardinale
K
18

I have also seen this error on Xcode 7.2 when the derived data becomes corrupted (in my case I interrupted a build and suspect that was the root cause).

So if the other solutions (notably Chris's and BraveS's which I suspect are more likely) do not fit your problem try deleting derived data (Select: Window / Projects / Derived Data -> Delete) and re-building.

(Added for reference by others - I know the original question has been answered correctly).

Kosiur answered 1/1, 2016 at 19:34 Comment(0)
J
15

Under Xcode 9.0b5 you may encounter this because Xcode 9.0b5 has a bug in it where when you add source code, it does not honor the target settings. You must go in and set each file's target manually afterwords:

Xcode project with manual target membership illustration

Jarvis answered 16/8, 2017 at 17:59 Comment(0)
A
13

In my Case , it was not a library, it was some classes ..

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_ClassNmae", referenced from: objc-class-ref in SomeClassName" . . .

d: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Solution I had several targets in Xcode with several schemas ( Production , Dev etc ) .. some of my newly added implementation ( Class.m ) were missing in

Xcode->Targets->Build Phases->Compile Sources

So I had to add them manually.

then I could compile & build successfully.

Accrue answered 9/6, 2016 at 12:19 Comment(1)
this solved my issue. I was using dynamic framework. another thing is that i don't like the idea to add manually.Colwen
M
9

I also encountered the same problem , the above methods will not work . I accidentally deleted the files in the following directory on it . enter image description here

Or

~/Library/Developer/Xcode/DerivedData/

enter image description here

Murrell answered 4/3, 2016 at 1:45 Comment(1)
To those wondering what the actual path/command is: it's ~/Library/Developer/Xcode/DerivedData/ Via the CLI you can clean out the directory as follows: rm -rf ~/Library/Developer/Xcode/DerivedData/Electrosurgery
C
8

I tried just about everything here but my problem turned out to be the remnants of a previous cocoapods build. What worked for me was:

  1. rm -Rf Pods; pod install
  2. Delete Derived Data (Window/Projects... select your target. click Delete Button)
  3. Rebuild
Cosmetic answered 2/9, 2016 at 15:19 Comment(0)
S
8

I have faced this issue many times. This usually comes when you delete your build folder.

The easy solution is to de-integrate and install the pod files again.

pod deintegrate
pod install
Stopple answered 16/4, 2019 at 12:0 Comment(0)
J
6

When updating to Xcode 7.1, you might see this type of error, and it can't be resolved by any of the above answers. One of the symptoms in my case was that the app runs on the device not in the simulator. You'll probably see a huge number of errors related to pretty much all of the frameworks you're using.

The fix is actually quite simple. You just need to delete an entry from the "Framework Search Paths" setting, found in your TARGETS > Build Settings > Search Paths section (make sure the "All" tab is selected)

enter image description here

If you see another entry here (besides $(inherited)) for your main target(s) or your test target, just delete the faulty path from all targets and rebuild.

Josphinejoss answered 4/11, 2015 at 16:8 Comment(0)
C
6

I have found this can also occur if you drag a folder with Objective-C files into your project. If that folder appears blue I think it indicates its not properly linked. You can verify this (if you use version control) because whenever you add new files the pbxproj file should update with links to those new files. However you may find that after you added a folder that the pbxproj file did not change (and hence there is a linking error). So you will get auto-complete working and it will find the classes you imported, but when it goes to actually build the image it fails with this error code.

The solution is to not add the folder but rather add the files. Do this and you should see the pbxproj file update and it should fix this error.

This also assumes you've done what was suggested above and have properly linked all the right frameworks.

Chargeable answered 28/3, 2016 at 16:44 Comment(0)
C
5

I know it's an old question but today got the same error and non of the above solutions worked.

Have fixed it however by setting option:

Project -> Architecture -> Build Active Architecture Only

to Yes

and project compiles and builds properly

Cenis answered 3/6, 2018 at 19:3 Comment(0)
F
5

This is also happend with apple M1 chip.

Here is my solution just check Open using Rosetta enter image description here Steps:

  1. Go to application > right click xcode > get info > check Open using Rosetta
  2. Restart the system.
Floatfeed answered 11/8, 2022 at 3:37 Comment(0)
N
4

I had the same error, because instead of deleting a file I simply removed references to it. Locating the file in Finder and removing it helped.

Ninette answered 2/1, 2016 at 8:9 Comment(0)
B
3

If you're getting this error when trying to link to a C file, first double check the function names for typos. Next double check that you are not trying to call a C function from a C++ / Objective-C++ environment without using the extern C {} construct. I was tearing my hair out because I had a class that was in a .mm file which was trying to call C functions. It doesn't work because in C++, the symbols are mangled. You can actually see the concrete symbols generated using the nm tool. Terminal to the path of the .o files, and run nm -g on the file that is calling the symbol and the one that should have the symbol, and you should see if they match up or not, which can provide clues for the error.

nm -g file.o

You can inspect the C++ symbols demangled with this:

nm -gC file.o
Bubal answered 8/9, 2016 at 23:38 Comment(0)
D
3

In my case, I built a custom framework with Deployment target set to 9.1, but the Deployment target of my app was lower, which supports 8.1. Minimize the custom framework Deployment target solved my problem.

Delouse answered 24/2, 2018 at 9:30 Comment(0)
D
3

I got it solved by adding "-lc++" in Other Linker Flags in Build Settings.

Discoid answered 6/5, 2019 at 10:21 Comment(0)
M
2

I am late to the party but thought of sharing one more scenario where this could happen. I was working on a framework and was distributing it over cocoapods. The framework had both objective c and swift classes and protocols and it was building successfully. While using pod in another framework or project it was giving this error as I forgot to include .m files in podspec. Please include .swtift,.h and .m files in your podspec sources as below: s.source_files = "Projectname/Projectname/**/*.{swift,h,m}"

I hope it saves someone else's time.

Mcculloch answered 1/10, 2018 at 9:51 Comment(0)
S
2

in my case I had to add

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
to my podfile and then delete the /Pods directory and run `pod install`

(Xcode 10.1)

Sunup answered 9/1, 2019 at 20:57 Comment(0)
R
2

This might help somebody. It took me days to finally figure it out. I am working in OBJ-C and I went to:

Project -> Build Phases -> Compile sources and added the new VC.m file I had just added.

I am working with legacy code and I am usually a swifty, new to OBJ-C so I didn't even think to import my .m files into a sources library.

EDIT:

Ran into this problem a second time and it was something else. This answer saved me after 5 hours of debugging. Tried all of the options on this thread and more. https://mcmap.net/q/35638/-undefined-symbols-for-architecture-armv7 Please give him credit if this helps you, but basically you might need to set your file to its target in file inspector.

This is your file inspector, just make sure all the targets you need are "ticked"

All in all, this is a very vague Error code that could be caused for a lot of reasons, so keep on trying different options.

Radicand answered 18/2, 2019 at 17:6 Comment(0)
I
2

In my case problem was compiled framework architecture.
I'm running Xcode 11 and using Swift 5.1

  • I had 3 target like:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

I was tried to run tests but MyAppFrameWork product was compiled for Generic iOS Devices and the Test target needed an arm x86-64, So I rebuilt Framework for iOS Simulators and test cases successfuly start running.

Iridosmine answered 10/6, 2020 at 19:45 Comment(0)
R
2

What helped me was adding s.static_framework = true to my /podspec in the project that was throwing the error.

Rickert answered 4/3, 2021 at 17:30 Comment(0)
P
1

For me, this started to happen after merge conflict.

I tried to clean and remove build folder, but none of it helped. This issue kept happening regardless. Then I relinked the reference by deleting the groups that was problematic and re-added to the project and it worked.

Pancake answered 3/4, 2017 at 15:26 Comment(0)
F
1

Sometime, I forget to copy library from Release-universal and mistakenly copy from Release-iphoneos. Usually Release-iphoneos contains .a file which has been pruned for X86. and so it gives the error.

Feaze answered 13/3, 2019 at 14:45 Comment(0)
W
1

in my case, removing selection of target membership and then select again fix the issue.

Check William Cerniuk answer with the attachment photo.

Whinstone answered 29/5, 2019 at 18:56 Comment(0)
F
1

In my case I was getting this error: Undefined symbols for architecture x86_64: "_OBJC_CLASS _ $ _ RCTImageLoader"

And I was able to fix it by adding the following line in my Podfile file:

pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'

Reference

Flinty answered 16/3, 2021 at 4:0 Comment(0)
T
1

Undefined symbols for architecture x86_64

I have run on this issue when used CocoaPods with some dependency which did not have specific version, that is why after pod update it downloaded the latest version which included some breaking changes

  • Upgrade dependencies and code for using them
  • Set specific version of pod
  • Remove Derived Data[About] folder
Thorman answered 26/4, 2021 at 15:57 Comment(0)
A
0

Could also be an #include <windows.h> in the .c file that you're trying to compile.

Atheist answered 11/4, 2017 at 8:21 Comment(0)
N
0

It happens when you are using architecture arm6, arm7 in your current project but any 3rd party framework which you are trying to consume in your project is built over x86_64.

For e.g If you are using Cocoa Pods in your project, then you need to add following script to make sure all 3rd party frameworks ensure arm6, arm7. i.e

Sample podfile with script to be add at end

target 'XYZ_ProjectTarget' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
  
  # Pods for XYZ_ProjectTarget
  pod 'pod_name'
  
  target 'XYZ_TargetTests' do
    inherit! :search_paths
    # Pods for testing
  end
  
  target 'XYZ_TargetUITests' do
    # Pods for testing
  end
  
end

post_install do |installer_representation|
  installer_representation.project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ARCHS'] = 'armv7 armv7s'
    end
  end
end
Nyssa answered 16/6, 2021 at 6:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.