58

I have duplicate symbol _main.

The problem is it says "Duplicate symbol _main in /Users/.../i386/main-B9843B6026D6EFA4.o and /Users/.../i386/main-B9843B6026D6EFA4.o", the XXX and XXX are actually the same .o file. I don't know why it thinks it's duplicate symbol when it's the same .o?!

Any help appreciated, thanks.

huggie
  • 17,587
  • 27
  • 82
  • 139

10 Answers10

92

Ah..I figure out it's that I have multiple entries under Targets/Compiled Sources ( in newer XCode it's under Build Phases/Compile Sources ). I removed them and the problem is solved. The multiple entry thing probably has to do with Git merge.

cjmling
  • 6,896
  • 10
  • 43
  • 79
huggie
  • 17,587
  • 27
  • 82
  • 139
23

It appeared that in my case I was importing a .m file instead of its .h counterpart. Solved by editing

#import "Tools.m"

into

#import "Tools.h"
dvkch
  • 1,079
  • 1
  • 12
  • 20
16

I also had this problem and it was caused by code I imported from another project. I did a grep for "int main" in my project directory:

grep -nr "int main" .

and found

./main.m:13:int main(int argc, char *argv[])
./IMPORTED_DIR/main.m:13:int main(int argc, char *argv[])

the IMPORTED_DIR contained the extra main.m that was causing the error for me

I removed that file from the Project -> Targets -> Build phases -> Compile sources list and then it compiled

Stefan
  • 266
  • 2
  • 3
  • i made a search by int main and i had two equal files, I removed one and project run. thank you ;) – Pedro Romão Dec 03 '14 at 16:53
  • I ran `grep -nr "int main" .` and found a sample project within my project that came in as part of an SDK download that I added. After finding this out, I deleted those files via Xcode and voilà! The project now builds. Thanks. – John Erck Jan 14 '15 at 17:40
8

I was facing the same issue with using two third party framework. (AppLovin and Flurry) And I came to know that by removing "all_load" from "Other Linker Flags" in build settings.

Arbaz Shaikh
  • 407
  • 7
  • 16
3

I had the same problem opening a project, that was created with Xcode 4.0.2, with Xcode 4.1. I simply solved by clicking on "Modernize Project" (Editor/Modernize Project). This procedure automatically removed all duplicates.

Kas1a
  • 31
  • 2
3

If still have a problem, try to search like this: "int main(", and remove those files except main.m

Altynbek Usenbekov
  • 688
  • 1
  • 8
  • 14
2

Just got this problem myself, but after reading huggie's solution which did lead me on the right track, I was left a bit confused. So current solution in Xcode: Choose project, target -> build phases and click validate settings

Then Xcode will auto fix its own mistake. It is always nice when the tools tries to stop your progress ;)

InvulgoSoft
  • 3,231
  • 1
  • 16
  • 6
2

In my case, I declared an NSString in my constants file (imported by many classes) but forgot to define it as static!!

e.g. NSString* PARAMS = @"paramA"; should be: static NSString* PARAMS = @"paramA";

Reading the full error message allowed me to figure this out: "Duplicate symbol PARAMS". Don't be afraid and try to understand error messages! Sometimes they might even tell you exactly what you did wrong.

1

In my case, I had imported another project, in order to utilize a library contained within. It resulted my project having two main.m files.

This was even more confusing, since the error didn't show up until several builds later.

Fluffhead
  • 845
  • 1
  • 9
  • 21
0

You can get this for method names too!

I got duplicate symbol _runOnMainQueueWithoutDeadlocking after adding DBCamera via CocoaPods and it was because both my category on NSObject (NSObject+Tools.h) and the GPUImage dependency file GPUImageOutput.m both had a method called 'runOnMainQueueWithoutDeadlocking'.

I was fortunate enough to be able to remove my method from code because I wasn't actually using it anymore or anywhere.

It's probably what I deserve for putting a category on NSObject.

kraftydevil
  • 5,144
  • 6
  • 43
  • 65