2010-03-29 18 views
10

Recibo el siguiente error en Xcode 3.2.1 en Snow Leopard 10.6.2 cada vez que intento compilar cualquier aplicación de iPhone generada por Appcelerator's Titanium. Sin embargo, el error de compilación solo aparece cuando selecciono el simulador de iPhone en el menú de arquitectura, y si selecciono el dispositivo de iPhone, puedo ejecutar la aplicación en mi dispositivo.Xcode duplicate symbol _main

Además, el simulador de iPhone se inicia con éxito y ejecuta el programa directamente desde el entorno Titanium, que usa Xcode para compilar.

¿Por qué sucede esto?

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

Respuesta

19

No puedo decir por qué esto está ocurriendo, pero puedo sugerir una solución. Cuando comenté todo el contenido del archivo main.m que se generó para mi proyecto Titanium, pude compilarlo correctamente y ejecutarlo en el simulador. Avísame si eso funciona para ti.

+3

Como aclaración, la razón por la que ve el error es que libTitanium, el archivo de la biblioteca primaria de Titanium, contiene un punto de entrada 'main' y, por lo tanto, es redundante para la función' main' en main.m. No estoy seguro de por qué este problema no aparece en ninguna otra parte, pero debe ser algo con la forma en que Titanium invoca el compilador, para engancharlo en su punto de entrada en lugar de hacerlo en main.m. – warrenm

+0

Gracias warren, Funciona :) –

+2

En mi caso, una biblioteca que estoy usando tenía su propio main.m. Comentó y funcionó –

11

Compruebe si tiene varias declaraciones de funciones principales en su proyecto.

8

Acabo de pasar un par de horas luchando contra este. Fue porque estaba usando el indicador del enlazador -all_load. Si está usando esa bandera para evitar el error de categoría, hay algunas otras soluciones: consulte here.

+0

http://stackoverflow.com/questions/932856/calling-method-on-category-included-fond-iphone-static-library-causes-nsinvalidar, el enlace sugiere utilizar -ObjC. – AechoLiu

+1

Esta fue la causa de nuestro proyecto. Era un proyecto más antiguo en el que -all_load se estaba utilizando y acabamos de vincular una nueva biblioteca. El resultado fue más de 200 duplicaciones. Quitar -all_load lo solucionó. –

+0

Te amo. gracias – DanMoore

0

Descubrí que esto sucedió cuando tenía un archivo de implementación con una función principal (por ejemplo abc.m) y también tenía otro main.m. Una vez que comente la función principal en abc.m, el proyecto se compiló correctamente.

6

Tuve un problema similar. Una clase de prueba de unidad fue incluida accidentalmente en mi compilación. Si usted busca en su proyecto de "principales" (que probablemente encontrará las funciones duplicadas

+0

Mismo problema. ¡Gracias por mencionar el archivo de prueba de la unidad! – nonamelive

+0

Horas! pasé horas !. De nuevo, gracias por mencionar main.c –

1

Esto me pasó por 2 razones:.

1: Clase A llama a la clase B y ambos había importado la misma clase. Solucionarlo mediante la importación de la clase en el archivo .m

2: Dos clases tienen una constante con el mismo nombre (incluso si la constante se define en el archivo .m). Solucionarlo cambiando el nombre de las constantes.

0

Parece que hay varias maneras de entrar en este estado. El mío era diferente. Leí una pista donde se podía arrastrar desde un evento de selección .xib tor en la implementación .h de su controlador de vista y generará automáticamente sus métodos. Lo hizo, lo cual fue genial. Inmediatamente comencé a recibir errores duplicados de símbolos, lo cual no fue genial.

No tuve tiempo de profundizar en el enlazador para ver qué sucedía. Creé un nuevo controlador de vista, copié el contexto de mi viejo .xib en el chico nuevo. Se borraron los viejos .h, .m y .xib y se construyeron y funcionaron nuevamente. Muy extraño, desperdicio de tiempo muy molesto.

Obviamente, hay algún error con esta "conveniencia" xcode.

0

Basado en lo que puedo decir de estas otras respuestas, necesitaré eliminar un montón de métodos main.

Pero para hacer eso fácilmente primero tengo que eliminar todos los comentarios gd de mis archivos porque están asiduamente documentados con los comentarios en casi cada otra línea

Esta expresión regular coincide con todos los multi-línea C Comments incluyendo sus delimitadores & que pueden ayudarle en su viaje

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

tuve este problema porque yo defino un archivo como tal:

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

y también tenía un main.m archivo:

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

pasé más de una hora en la búsqueda de una respuesta correcta, pero nada funcionó para mí. Finalmente, el xcode dice algo que está duplicado, así que vaya a esa carpeta en particular (en este caso: /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build /Objects-normal/i386/main.o) y borra todos los archivos y también los verifica en tu proyecto si esa clase/interfaz en particular se declara dos veces si la eliminas.

Después de la eliminación, limpie y ejecute el proyecto.

Funcionó para mí espero que esto ayude (-_-).

-1

Borrar /Users/{username}/Library/Developer/Xcode/DerivedData carpeta y compilar de nuevo.

Cuestiones relacionadas