2012-02-18 17 views
10

Estoy aprendiendo el lenguaje Objective-C. Como no tengo una Mac, estoy compilando y ejecutando mi código dentro de la plataforma Ubuntu 11.04.Problemas al compilar el Objetivo C con Clang (Ubuntu)

Hasta ahora, estaba usando gcc para compilar. He instalado GNUStep y todo estaba funcionando. Pero luego comencé a probar algunas características de Objective-C 2.0, como @property y @synthesize, que gcc no permite.

Así que traté de compilar el código con Clang, pero parece que no está vinculando correctamente mi código con las bibliotecas GNUStep, ni siquiera con un simple programa Hola mundo.

Por ejemplo, si puedo compilar el código siguiente:

#import <Foundation/Foundation.h> 

int main(void) { 
    NSLog(@"Hello world!"); 
    return 0; 
} 

La salida del compilador es:

/tmp/cc-dHZIp1.o: In function `main': 
test.m:(.text+0x1f): undefined reference to `NSLog' 
/tmp/cc-dHZIp1.o: In function `.objc_load_function': 
test.m:(.text+0x3c): undefined reference to `__objc_exec_class' 
collect2: ld returned 1 exit status 
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation) 

El comando que estoy utilizando para compilar es

clang -I /usr/include/GNUstep/ test.m -o test 

con la directiva -I para incluir las bibliotecas GNUStep (de lo contrario, Clang no puede encontrar Foundation.h).

He buscado en Google mi problema y he visitado las páginas web de GNUStep y Clang, pero no he encontrado una solución para ello. Entonces cualquier ayuda será apreciada.

Gracias!

Respuesta

1

Usted puede intentar compilador gcc:
En primer lugar instalar Objective-C de tiempo de ejecución de GNU: sudo apt-get install gobjc
a continuación, compilar: gcc -o hello hello.m -Wall -lobjc

+0

Hola URLArenzo.Ya instalé ese paquete e intenté compilar gcc (funcionaba perfectamente). Sin embargo, descubrí que gcc no permite algunas características de Objective-C 2.0; así que estoy tratando de hacer que todo funcione con el compilador Clang. –

6

El problema era que la biblioteca gnustep-base no estaba siendo usado por el enlazador. Así que la solución a este estaba usando la opción -Xlinker, que envía argumentos al enlazador utilizado por ruido metálico:

clang -I /usr/include/GNUstep/ -Xlinker -lgnustep-base test.m -o test 

La declaración "-X enlazador -lgnustep-base" hecha la magia. Sin embargo, he tenido problemas con este comando relacionado con la clase que representa una cadena en Objective-C:

./test: Uncaught exception NSInvalidArgumentException, reason: GSFFIInvocation: 
Class 'NXConstantString'(instance) does not respond to forwardInvocation: for 
'hasSuffix:' 

pude resolverlo añadiendo el argumento "-clase cadena -fconstant = NSConstantString":

clang -I /usr/include/GNUstep/ -fconstant-string-class=NSConstantString \ 
-Xlinker -lgnustep-base test.m -o test 

Además, he intentado con algunas piezas de código de Objective-C 2.0 y parece que funciona.

¡Gracias por la ayuda!