2010-03-29 9 views
10

Ich erhalte den folgenden Fehler in Xcode 3.2.1 auf Snow Leopard 10.6.2, wenn ich versuche, eine iPhone-Anwendung zu kompilieren, die von Appcelerator's Titanium generiert wird. Der Erstellungsfehler wird jedoch nur angezeigt, wenn ich den iPhone-Simulator im Architekturmenü auswähle und wenn ich ein iPhone-Gerät auswähle, kann ich die App auf meinem Gerät ausführen.Xcode duplicate symbol _main

Außerdem startet der iPhone-Simulator erfolgreich und führt das Programm direkt aus der Titanium-Umgebung aus, die Xcode zum Erstellen verwendet.

Warum passiert das?

ld: duplicate symbol _main in Resources/libTitanium.a(main.o) and /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build/Objects-normal/i386/main.o collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Antwort

19

Ich kann Ihnen nicht sagen, warum dies geschieht, aber ich kann eine Abhilfe vorschlagen. Als ich den gesamten Inhalt der main.m-Datei auskommentierte, die für mein Titanium-Projekt generiert wurde, konnte ich erfolgreich kompilieren und auf dem Simulator ausführen. Lassen Sie mich wissen, ob das für Sie funktioniert.

+3

Zur Verdeutlichung ist der Grund, warum Sie den Fehler sehen, dass libTitanium, die primäre Titanium-Bibliotheksdatei, einen "Haupt" -Eintrittspunkt enthält und daher für die Hauptfunktion in main.m redundant ist. Ich bin nicht sicher, warum dieses Problem an anderer Stelle nicht auftritt, aber es muss etwas mit der Art sein, auf die der Compiler von Titanium aufgerufen wird, um in ihren Einstiegspunkt statt den in main.m einzuhaken. – warrenm

+0

Danke Warren, Es funktioniert :) –

+2

In meinem Fall hatte eine Bibliothek, die ich benutze, eine eigene main.m. Kommentiert und es funktioniert –

11

Überprüfen Sie, ob Sie mehrere Deklarationen der Hauptfunktion in Ihrem Projekt haben.

8

Ich habe gerade ein paar Stunden mit diesem Kampf verbracht. Es war, weil ich das -all_load-Linker-Flag verwendete. Wenn Sie dieses Flag verwenden, um den Bug der Kategorie zu umgehen, gibt es einige andere Lösungen - siehe here.

+0

http://stackoverflow.com/questions/932856/calling-method-on-category-included-from-iphone-static-library- causes-nsinvalidar, schlägt der Link -ObjC zu verwenden. – AechoLiu

+1

Das war die Ursache in einem Projekt. Es war ein älteres Projekt, bei dem -all_load verwendet wurde und wir haben gerade eine neue Bibliothek verbunden. Das Ergebnis waren über 200 Duplikationen. Das Entfernen von -all_load hat es behoben. –

+0

Ich liebe dich. danke – DanMoore

0

Ich fand dies passiert, wenn ich eine Implementierungsdatei mit einer Hauptfunktion darin hatte (sagen wir abc.m) und hatte auch eine andere main.m. Sobald ich die Hauptfunktion in abc.m auskommentierte, kompilierte das Projekt erfolgreich.

6

Ich hatte ein ähnliches Problem. Eine Unit-Test-Klasse wurde versehentlich in meinen Build aufgenommen. Wenn Sie Ihr Projekt für „main (“ search werden Sie wahrscheinlich die doppelten Funktionen finden

+0

Gleiches Problem. Danke, dass Sie die Unit-Testdatei erwähnt haben! – nonamelive

+0

Stunden! Ich verbrachte Stunden! Nochmals vielen Dank für die Erwähnung von main.c –

1

Dieses aus 2 Gründen mir passiert ist.

1: Klasse A ruft Klasse B und beide hatten die gleiche Klasse importiert. Beheben Sie den Fehler, indem Sie die Klasse in die .m-Datei importieren

2: Zwei Klassen haben eine Konstante mit demselben Namen (auch wenn die Konstante in der .m-Datei definiert ist.) Fixieren Sie sie, indem Sie den Namen der Konstanten ändern.

0

Scheint, als gäbe es mehrere Möglichkeiten, in diesen Zustand zu kommen.Meine war anders.Ich las einen Hinweis, wo Sie von einem .xib Event Selec ziehen könnten in die .h-Implementierung Ihres View-Controllers ein, und dies würde Ihre Methoden automatisch aktivieren. Es tat - was cool war. Ich fing sofort an, doppelte Symbolfehler zu bekommen - was nicht cool war.

Ich hatte keine Zeit, tief in den Linker zu graben, um zu sehen, was passiert ist. Ich habe einen neuen View-Controller erstellt, den Kontext meiner alten .xib in den neuen Typ kopiert. Habe die alten .h, .m und .xib gelöscht und gebaut und es hat wieder funktioniert. Sehr merkwürdig, sehr nervige Zeitverschwendung.

Es gibt offensichtlich einige Fehler mit diesem xcode "Komfort".

0

Ausgehend von dem, was ich von diesen anderen Antworten erzählen kann, werde ich eine Reihe von main Methoden entfernen müssen.

Aber das zu tun, einfach zuerst muss ich alle gd Kommentare von meinen Dateien entfernen, weil sie eifrig mit Kommentaren an fast jeder zweiten Zeile

Dieser regulären Ausdruck alle C mehrzeiligen ihre Trennzeichen Anmerkungen einschließlich dokumentiert & können Sie auf Ihrer Reise

/\*((?!\*/).)*\*/ 
0

ich helfen, dieses Problem hatte, weil ich eine Datei als solche definieren:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 
... 
} 

Und hatte auch eine Datei main.m:

int main(int argc, char* argv[]) 
{ 
    @autoreleasepool { 
     int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
     return retVal; 
    } 
} 
0

Ich verbrachte mehr als eine Stunde für eine richtige Antwort bei der Suche, aber nichts für mich gearbeitet. Schließlich ist der xcode, der sich selbst erzählt, dupliziert, also geh zu diesem bestimmten Ordner (in diesem Fall: /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonsimulator/Final.build /Objects-normal/i386/main.o) und lösche alle Dateien und überprüfe sie auch in deinem Projekt, ob diese bestimmte Klasse/Schnittstelle zweimal deklariert wird, wenn ja, lösche sie.

Nach dem Löschen sauber und führen Sie das Projekt.

Es funktionierte für mich hoffe, dass dies hilft (-_-).

-1

Löschen Sie /Users/{username}/Library/Developer/Xcode/DerivedData Ordner und erneut erstellen.