2012-07-11 13 views
8

Parece haber bastantes tutoriales sobre cómo hacer esto, cada uno ligeramente diferente. Espero que alguien pueda reconocer los mensajes de error que recibo y apuntarme en la dirección correcta.Objective-C en Linux Compile Error

Mi código, hm es:

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) 
{ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
NSLog (@"hello world"); 
[pool drain]; 
return 0; 
} 

Antes de compilar, entran en la consola:

. /usr/share/GNUstep/Makefiles/GNUstep.sh 

intento compilar con:

gcc `gnustep-config --objc-flags` -lgnustep-base h.m -o hello 

y obtener:

 
/tmp/ccgLOnpY.o: In function `main': 
/home/ge/objective-c/h.m:4: undefined reference to `objc_get_class' 
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup' 
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup' 
/home/ge/objective-c/h.m:5: undefined reference to `NSLog' 
/home/ge/objective-c/h.m:6: undefined reference to `objc_msg_lookup' 
/tmp/ccgLOnpY.o: In function `__objc_gnu_init': 
/home/ge/objective-c/h.m:8: undefined reference to `__objc_exec_class' 
/tmp/ccgLOnpY.o:(.data.rel+0x0): undefined reference to `__objc_class_name_NSConstantString' 
/tmp/ccgLOnpY.o:(.data.rel+0x8): undefined reference to `__objc_class_name_NSAutoreleasePool' 
collect2: ld returned 1 exit status 

¿Puede alguien señalarme en la dirección correcta?

TIA

+1

¿Por qué no se construye con gnustep-make usando GNUmakefile? Aquí está cómo escribir uno http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html –

Respuesta

29

El motivo del error de enlace es más probable debido al comportamiento de enlazador para enlazar las bibliotecas solamente después de ver los símbolos en la compilación antes de la vinculación de la biblioteca. Como h.m aparece después de -lgnustep-base, la biblioteca no está vinculada ya que aún no se encuentran los símbolos en la biblioteca. Se puede indicar o bien el enlazador para enlazar las bibliotecas, incluso si los símbolos no se encuentran utilizando la opción -Wl,--no-as-needed enlazador como se

gcc `gnustep-config --objc-flags` -Wl,--no-as-needed -lgnustep-base h.m -o hello 

O mejor aún sólo hay que mover la fuente al principio del comando de compilación como

gcc h.m `gnustep-config --objc-flags` -lgnustep-base -o hello 

El comportamiento del enlazador observado es desalentar buscando & vinculando símbolos de la biblioteca que pueden no ser necesarios pero están enlazados en la compilación de todos modos, por lo tanto la segunda opción sería una manera recomendada de hacer en lugar de agregar la opción del enlazador -Wl, --no-as-needed.
Espero que esto ayude!

+0

Gracias AnotherAnon, esa última línea de comando lo clava. ¡Gracias! – Geremy

+0

sí, es realmente útil, muchas gracias – Leo

9

Necesitarás un enlace a libobjc. La solución es bastante simple; acaba de compilar con:

gcc h.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello 
+0

Gracias Andy. Usando su línea de comando, todavía obtengo el mismo error exacto. – Geremy

2

Este método parece buena:

gcc h.m `gnustep-config --objc-flags` -lgnustep-base -o hello 
5

Es necesario especificar también las banderas de enlace:

gcc h.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \ 
-lobjc -lgnustep-base -o hello 
Cuestiones relacionadas