2012-02-18 16 views
10

Sto imparando il linguaggio Objective-C. Poiché non ho un Mac, sto compilando e eseguendo il mio codice all'interno della piattaforma Ubuntu 11.04.Problemi durante la compilazione dell'obiettivo C con Clang (Ubuntu)

Fino ad ora, stavo usando gcc per compilare. Ho installato GNUStep e tutto funzionava. Ma poi ho iniziato a provare alcune funzionalità di Objective-C 2.0, come @property e @synthesize, che gcc non consente.

Così ho provato a compilare il codice con Clang, ma sembra che non stia collegando correttamente il mio codice con le librerie GNUStep, nemmeno con un semplice programma Hello world.

Per esempio, se compilo il seguente codice:

#import <Foundation/Foundation.h> 

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

L'uscita del compilatore è:

/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) 

Il comando che sto usando per compilare è

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

con la direttiva -I per includere le librerie GNUStep (altrimenti, Clang non è in grado di trovare Foundation.h).

Ho cercato su google il mio problema e visitato sia le pagine Web GNUStep che quelle di Clang, ma non ho trovato una soluzione. Quindi ogni aiuto sarà apprezzato.

Grazie!

risposta

1

Si può provare compilatore gcc:
Prima di tutto installare GNU Objective-C Durata: sudo apt-get install gobjc
quindi compilare: gcc -o hello hello.m -Wall -lobjc

+0

Hi URLArenzo.Ho già installato quel pacchetto e ho provato a compilare gcc (funzionava perfettamente). Tuttavia, ho capito che gcc non consente alcune funzionalità di Objective-C 2.0; quindi sto cercando di far funzionare le cose con il compilatore Clang. –

6

Il problema era che la libreria gnustep-base non è stato utilizzato dal linker. Quindi, la soluzione a questo stava usando l'opzione -Xlinker, che trasmette gli argomenti al linker usato da clang:

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

L'affermazione "-X linker -lgnustep-base" fatto la magia. Tuttavia, ho avuto problemi con questo comando legate alla classe che rappresenta una stringa in Objective-C:

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

ho potuto risolverlo aggiungendo l'argomento "-fconstant-string-class = NSConstantString":

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

Inoltre, ho provato con alcuni pezzi di codice Objective-C 2.0 e sembra funzionare.

Grazie per l'aiuto!

Problemi correlati