244

I have imported framework for sending email from application in background i.e. SKPSMTPMessage Framework. Can somebody suggest why below error is shown

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Source from which framework is taken:-

Locking the Fields in MFMailComposeViewController

Update:

Answer:Just drag and drop folder over the project and click copy. Thats it select project check box and target check box as well.

Community
  • 1
  • 1
Mann
  • 5,477
  • 6
  • 45
  • 57

35 Answers35

570

You can get this type of error if your class' .m file is not listed under the "Compile Sources" step of the "Build Phases" tab of your target. Normally Xcode does this for you, but sometimes it loses the plot and you need to add the .m file manually.

To do this:

TargetSettings -> Build Phases -> Compile Sources -> add your .m class ->Build and Run

Matthew
  • 9,851
  • 4
  • 46
  • 77
Allen Pike
  • 6,107
  • 1
  • 19
  • 12
  • 49
    Sometimes those errors appear because some framework is not linked properly. Just check all frameworks in "Link Binary With Libraries" in project's build-phase tab. – Heitara Jul 10 '12 at 21:14
  • This can also happen with .c files, and presumably .mm too. – brodney Nov 19 '12 at 20:28
  • Rajneesh, did you fix the issue? If yes, how did you fix it? – codematrix May 24 '13 at 03:43
  • 9
    Its worth noting that you can select the .m file and tick the box next to your target in right panel "Target Membership" section. When you add a file to your project, you are asked if you want to "Add to targets:", you may have said no, but you can add it at any time by doing what i said. – Nicolas S May 30 '13 at 06:13
  • 4
    I used to have the same error, the solution for mine is: **Build Setting** -> **Linking** -> **Other Linker Flags** -> Add `-lLibraryName_$(PLATFORM_NAME)d` for **Debug**, and add `-lLibraryName_$(PLATFORM_NAME)` for **Release** – George Nov 03 '13 at 15:55
  • I had to click "Add Another" then go find it in the file directory. Then add it. Then add it again. – Joshua Dance Nov 15 '13 at 23:09
  • It happened to me whenI added Google Analytics. I forgot to add the static lib. I added only the .h files – Alex Tau Mar 07 '14 at 16:05
  • I had this issue after using cordova cli to remove and add a core plugin which had been updated (Camera). The .m was not in the Compile Sources, so I added it. Then got the architecture warning. The ImageIO.framework was missing, so adding that in the Link Binary With Libraries fixed the errors. Thanks Heitara! – islanddave Oct 29 '14 at 17:29
  • 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` – James Alvarez Sep 08 '16 at 23:46
37

for me the issue turned out to be missing frameworks. Once I added em, it worked.

verma
  • 753
  • 8
  • 8
  • This seemed like a long shot as it didn't really match the error messages I was getting but adding the dependent frameworks suggested on the SocketRocket site fixed it for me as well. – Pat Jul 16 '13 at 14:23
  • Even if you add frameworks through [cocoapods](https://cocoapods.org/) this can happen. I had to add it manually as a framework too. Thanks! – FBente Aug 16 '16 at 11:26
  • The Framework that I added needed other Frameworks to be added before it would build. If you're adding a Framework, check to make sure you've added any Framework it may need – Dave Patrick Feb 12 '18 at 19:43
29

Check the Valid Architectures & Build Active Architecture only properties.

enter image description here

Akshay
  • 5,747
  • 3
  • 23
  • 35
18

if you are using cocoapods make sure your target's build settings contain $(inherited) in the other linker flags section

enter image description here

Tim
  • 1,877
  • 19
  • 27
10

Is your framework compiled for armv(x)? It looks to me like it's compiled for i386, which code won't run on an iOS device. Or else it's compiled for armv(x) and you're trying to run it on the simulator, which is i386 code. Make sure, using the build settings Akshay displayed above, that your framework is correctly compiled for the chip you're going to run it on.

Owen Hartnett
  • 5,925
  • 2
  • 19
  • 35
  • Its sorted. i had to just drag and drop framework forlder into my project forlder in xCode. Thanks – Mann Aug 08 '11 at 15:56
  • is it possible to somehow compile a framework to run on both iOS device and simulator simultaneously? or should I always choose only one option? – Aleksey Tsyss Mar 22 '17 at 09:13
  • Are you talking about opening two windows to the same project, and setting one to run on the simulator and another on the device? – Owen Hartnett Mar 22 '17 at 17:06
7

If you importing some other project in xcode and if current and import project both have same files in Compiler source then just remove same file in current project in "Build phase' settings. It worked for me.

DPP
  • 12,716
  • 3
  • 49
  • 46
4

Also could be that you're missing to link against a Binary Library, check Build Phases in your Targes add required libraries and then Product > Clean Product > Build

That must work too!

Gabriel Ramirez
  • 131
  • 2
  • 4
4

I had this issue when I opened the same project twice, only one project was the original and the other was cloned from a git url.

'Product' > 'Clean' solved the problem.

kraftydevil
  • 5,144
  • 6
  • 43
  • 65
4

try this one last:

so I tried all the suggestions on this page.. none worked.. The way my problem started was by following the steps in this tutorial that teaches how to link static libraries. With my sample project the instructions worked fine.. but then on my actual project I started getting the error above.

So what I did was go through each step of the said tutorial and built after each step.. the offending line turned out to be this one: adding -all_load to build settings-> other linker flags

it turns out that this flag was recommended once upon a time to link categories to static libraries.. but then it turned out that this flag was no longer necessary Xcode 4.2+.. (same goes for the -force_load flag.. which was also recommended in other posts)..

Community
  • 1
  • 1
abbood
  • 23,101
  • 16
  • 132
  • 246
4

When I encountered the same problem as this:

Undefined symbols for architecture i386:

_OBJC_CLASS_$_SKPSMTPMessage, referenced from: objc-class-ref in ConfirmController.o

It turned out that I just forgot to add framework. It was QuartzCore.framework to be exact.

DD_
  • 7,230
  • 11
  • 38
  • 59
4

I also met this issue and I fixed it by checking if both compile source and link binary with library contained all the file/library/framework I required.

enter image description here

yujohnnyzhou
  • 330
  • 3
  • 7
4

Yeah this is related to what allen said... look for TargetMembership in Utilities section of the source file. there is a checkbox that associates that file to a project. Checking this solved this issue for me too.

yeahdixon
  • 6,647
  • 1
  • 41
  • 43
3

When I encountered the same problem, i forgot to add "compiled version of library(with extension .a)". Normally we add the library of the imported project in Target Dependency in Build Phases but we forget to add "compiled library" in Link Binary with Libraries in Build Phases.

Balamurugan
  • 117
  • 5
3

Adding what worked for me in case others have the same issue and end up here. I had an older project that had the CLANG_ENABLE_MODULES setting set to No. After hours of frustration I compared to a working project and found I had Enable Modules Set to no under my LLVM build settings. Setting this to Yes solved my problem and the app builds fine.

Project Settings -> Build Settings -> search for 'Modules' and Update Enable Modules (C and Objective-C) to YES.

jlichti
  • 867
  • 9
  • 7
  • Wonderful fix! This helped me a lot! I had an old pods project and every time I added a new pod this error would happen. Thanks!!! – DiscDev Sep 10 '14 at 16:31
3

Change in active architecture worked for me, One of my lib was using i386.

In build settings >> change Build Active Architecture Only to Yes from NO

It worked for me. Hope it helps to others as well.

enter image description here

Satish Mavani
  • 4,897
  • 2
  • 20
  • 30
2

I didnt add the "-all_load -lstdc++" to Other Linker Flags in the build setting and I was able to launch the sim without error but I did not get MonkeyTalk log output when launched and the a previous script that I wrote that used to connect now showed the play button as disabled. The output of the MT IDE showed as "Connection set to iOS Simulator", but not able to select the run/play button.

The original project had "ObjC -all_load" in the Other Linker Flags and when I appended the "-all_load -lstdc++" along with it I got the error message this post is about. When I removed the "ObjC -all_load" and only added the "-all_load -lstdc++" the project built, but still no monkey talk log out put as confirmation in the console

Laser Hawk
  • 1,988
  • 2
  • 23
  • 29
2

It's possible you're using a library that is only compiled for REAL hardware. For example, if you're using a Bluetooth library like the Zephyr HxM Smart, it probably won't compile on the simulator, and is only meant to run on real devices.

DiscDev
  • 38,652
  • 20
  • 117
  • 133
2

I discovered this HIGHLY misleading message while trying to upgrade to the new Google Analytics library.

In my case the problem was having TWO CONFLICTING COPIES of the library. They were in different folders but both were listed in my App's Library Build Paths (under Build Settings).

Moving all the deprecated library files out of the folder ended up doing the trick and made the mysterious error messages go away.

bkbeachlabs
  • 2,121
  • 1
  • 22
  • 33
1

Ran into a similar issue with IOS 6. Was able to solve it by adding storekit.framework to the "Link Binary with Libraries" in the build phases section.

Now, it works like a charm.

Troy
  • 961
  • 6
  • 13
  • 24
1

i have the same problem with 7 errors when i add PSTCollectionviewcontroller .The one solution for this problem is check your "xcode --> build phases-->compile sources" here add your all ".m" files ..I hope you this post will help users in future.

Naveen
  • 1,251
  • 9
  • 20
  • 38
1

On mine, I was using Cocoapods for an Augmented Reality project and what I found out was that when you implement cocoapods and open your project's .workspace, you end up with the Xcode Project target and those Pods target you implemented inside the same file. What was happening was that some of the .m were being used by both. After I removed the duplicated ones for the Xcode target at Build Phases >> Compile Sources, it worked fine.

Joao Paulo
  • 137
  • 2
  • 9
1

Check that all your bundle resources are copied in build phase.

Artjom B.
  • 61,146
  • 24
  • 125
  • 222
Arpan Dixit
  • 995
  • 1
  • 12
  • 24
1

Product => Clean did the trick for me

YogevSitton
  • 10,068
  • 11
  • 62
  • 95
0

I got this message when I drag and dropped some source files from another project. When I deleted them and then added them via the "Add Files..." from the File menu, it built without the error.

RyeMAC3
  • 1,023
  • 1
  • 10
  • 17
0

I had a similar error with NSManagedObject and it was because I was using Core Data but was missing the Core Data framework in Build Phases - Link Binary With Libraries, as some others have answered

Sam
  • 1
  • Welcome to SO Sam. When answering a question, try to add new insights, research, or code that doesn't already exist in another answer. If you simply want to share that another answer worked for you, try upvoting or commenting on their answer instead of posting a duplicate answer. – butch Jul 17 '13 at 17:32
0

You can get this type of error if you add third party libraries in your project that require native frameworks not included in your project.

You need to look inside the .h and .m files of your newly added library and see what frameworks it requires, then include those frameworks in your project (Target > Build Phases > Link Binary With Libraries).

Cosmin
  • 6,623
  • 3
  • 26
  • 28
0

Try remove the framework, clean project, add it back and compile. Or Remove the class which has been added by xcode in compile source, clean project, add it back then build.

Saif
  • 812
  • 1
  • 9
  • 18
0

Remember That you can put some macro in any view controller which is calling the files you've already deleted.

The app will not show any errors until you build your app, it will throw the error in compilation phase in .o files.

Remember to delete any MACRO that's calling to files you've already deleted.

Thanks :)

Atef
  • 2,872
  • 1
  • 36
  • 32
0

In addition to what Allan did, adding missing classes, I followed @emdog4's solution and added the Core Data library by going to Build Phases in Xcode and under the 'Link Binary with Libraries' clicking on the + and selecting the 'CoreData.framework'. This sorted out my error

malkoty
  • 99
  • 9
0

In my case it was a bit different

In the Prefix Header there was a define missing

#ifdef DEBUG
#   define TWDLog(fmt, ...) NSLog((@"\n%s\n" fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#   define TWDLog(...)
#endif

So search for PROJECTNAME-Prefix.pch and check if it has something missing in both projects

Shereef Marzouk
  • 3,282
  • 7
  • 41
  • 64
0

I got the same issue. And I add 2 framework I need to Build Phases. Hope this help! symbol(s) not found for architecture i386

777Q
  • 375
  • 3
  • 5
0

In my case the pod update didn't update the project somehow. So I had to do it by myself, adding the MBProgressHud to OtherLinkerFlags.

enter image description here

Naloiko Eugene
  • 2,453
  • 1
  • 28
  • 18
0

None of the above answer solved my issue. I got this same error when after I upgraded Xcode to 8, I went to Target --> Build Phases --> The Link Binary With Libraries and delete the framework that caused the problem and re added it and all the errors went away. Hope this will help others. enter image description here

JIANG
  • 1,687
  • 2
  • 19
  • 36
0

Just enable the "Build Active Architecture Only" option

in PROJECT >> Build Settings >> Build Active Architecture Only >> Yes

screenshot of the path to the configuration

remember to check if they are also enabled in each target

Felipe
  • 150
  • 1
  • 16
0

Answer is you just drag and drop folder over the project and click copy.

Mann
  • 5,477
  • 6
  • 45
  • 57