2010-03-29 14 views
10

Ho riscontrato il seguente errore in Xcode 3.2.1 su Snow Leopard 10.6.2 ogni volta che provo a compilare qualsiasi applicazione iPhone generata da Appcelerator's Titanium. Tuttavia, l'errore di compilazione appare solo quando seleziono il simulatore iPhone nel menu architettura, e se seleziono il dispositivo iPhone, posso eseguire l'app sul mio dispositivo.Simbolo Xcode duplicato _main

Inoltre, il simulatore di iPhone viene avviato correttamente ed esegue il programma direttamente dall'ambiente Titanium, che utilizza Xcode per la creazione.

Perché sta succedendo?

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

risposta

19

io non posso dirvi perché questo sta accadendo, ma posso suggerire una soluzione. Quando ho commentato l'intero contenuto del file main.m che è stato generato per il mio progetto Titanium, sono stato in grado di compilare correttamente ed eseguire sul simulatore. Fammi sapere se per te va bene.

+3

Come spiegazione, il motivo per cui viene visualizzato l'errore è che libTitanium, il file di libreria Titanium primario, contiene un punto di ingresso 'main' e quindi è ridondante alla funzione' main' in main.m. Non sono sicuro del motivo per cui questo problema non emerge altrove, ma deve essere qualcosa con il modo in cui il compilatore viene invocato da Titanium, per collegarsi al loro punto di ingresso anziché a quello in main.m. – warrenm

+0

Grazie warren, Funziona :) –

+2

Nel mio caso, una libreria che sto usando ha il suo main.m. Commentato e ha funzionato –

11

Verificare se nel progetto sono presenti più dichiarazioni della funzione principale.

8

Ho appena trascorso un paio d'ore a combattere questo. Era perché stavo usando il flag -all_load linker. Se stai usando questo flag per aggirare il bug della categoria, ci sono altre soluzioni - vedi here.

+0

http://stackoverflow.com/questions/932856/calling-method-on-category-included-from-iphone-static-library-causes-nsinvalidar, il link suggerisce di usare -ObjC. – AechoLiu

+1

Questa è stata la causa in un nostro progetto. Si trattava di un progetto precedente in cui era stato utilizzato -all_load e abbiamo collegato solo una nuova libreria. Il risultato è stato di oltre 200 duplicati. Rimuovendo -all_load risolto. –

+0

Ti amo. grazie – DanMoore

0

Ho trovato questo è accaduto quando ho avuto un file di implementazione con una funzione principale in esso (ad esempio abc.m) e aveva anche un altro main.m. Dopo aver commentato la funzione principale in abc.m, il progetto è stato compilato correttamente.

6

Ho avuto un problema simile. Una classe di test unitario è stata accidentalmente inclusa nella mia build. Se si cerca il progetto per i "principali (" probabilmente vi trovate le funzioni duplicate

+0

Stesso problema. Grazie per aver menzionato il file di test unitario! – nonamelive

+0

Ore! ho passato ore !. Ancora una volta, grazie per aver menzionato main.c –

1

Questo è accaduto a me per 2 motivi:.

1: Classe A chiama classe B e sia aveva importato la stessa classe. Risolvilo importando la classe nel file .m

2: due classi hanno una costante con lo stesso nome (anche se la costante è definita nel file .m). Risolvila cambiando il nome delle costanti.

0

Sembra che ci siano molti modi per entrare in questo stato, il mio era diverso, ho letto un suggerimento in cui è possibile trascinare da un evento .xib nell'implementazione .h del tuo controller di visualizzazione e automaticamente i tuoi metodi. Lo ha fatto - che è stato bello. Ho subito iniziato a ottenere errori di simboli duplicati, il che non era bello.

Non ho avuto il tempo di scavare in profondità nel linker per vedere cosa è successo. Ho creato un nuovo controller di visualizzazione, copiato il contesto del mio vecchio .xib nel nuovo tipo. Cancellato il vecchio .h, .m e .xib e costruito e ha funzionato di nuovo. Spreco di tempo molto strano, molto fastidioso.

C'è ovviamente qualche problema con questo xcode "convenienza".

0

Sulla base di quello che posso dire da queste altre risposte, ho bisogno di essere rimosso un gruppo di metodi main.

Ma per farlo facilmente ho bisogno di rimuovere tutti i commenti gd dai miei file perché sono assiduamente documentati con i commenti a quasi ogni altra linea

Questa espressione regolare corrisponde a tutti multi-linea C Commenti compresi i loro delimitatori & può aiutarvi nel vostro cammino

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

ho avuto questo problema perché mi definisco un file come ad esempio:

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

e aveva anche un file main.m:

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

ho speso più di un'ora nella ricerca di una risposta corretta, ma niente ha funzionato per me. Infine il xcode dice che qualcosa è duplicato, quindi vai a quella cartella particolare (in questo caso: /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build /Objects-normal/i386/main.o) ed elimina tutti i file e controlla anche nel progetto se quella particolare classe/interfaccia è dichiarata due volte se sì la cancella.

Dopo la cancellazione, pulire ed eseguire il progetto.

Ha funzionato per me spero che questo aiuti (-_-).

-1

Elimina cartella /Users/{username}/Library/Developer/Xcode/DerivedData e crea nuovamente.

Problemi correlati