2012-07-11 16 views
8

Sembrano esserci parecchie esercitazioni su come eseguire questa operazione, ciascuna leggermente diversa. Spero che qualcuno possa riconoscere i messaggi di errore che sto ricevendo e indicarmi la giusta direzione.Errore di compilazione Objective-C su Linux

Il mio codice, hm è:

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

Prima compilo, ho immettere nella console:

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

provo a compilare con:

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

e ottenere:

 
/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 

Qualcuno può indicarmi la giusta direzione?

TIA

+1

Perché non costruire con gnustep-usando l'GNUmakefile? Ecco come scriverne uno http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html –

risposta

29

La ragione per l'errore di collegamento è molto probabilmente a causa del comportamento di linker per collegare le librerie solo dopo aver visto i simboli di compilazione prima che collega la biblioteca. Quando h.m viene visualizzato dopo -lgnustep-base, la libreria non è collegata poiché i simboli nella libreria non sono ancora stati rilevati. O si può istruire il linker per collegare le librerie, anche se i simboli non si incontrano usando l'opzione -Wl,--no-as-needed linker come

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

O meglio ancora solo spostare la sorgente all'inizio del comando di compilazione come

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

Il comportamento del linker osservato è di scoraggiare la ricerca dei simboli di libreria & che potrebbero non essere necessari ma sono comunque collegati nella compilazione, quindi la seconda opzione sarebbe consigliata, invece di aggiungere l'opzione di collegamento -Wl, --no-as-needed.
Spero che questo aiuti!

+0

Grazie AnotherAnon, l'ultima linea di comando lo inchioda. Grazie! – Geremy

+0

sì, è davvero aiutato, grazie mille – Leo

9

Avrete bisogno di collegarvi a libobjc. La soluzione è piuttosto semplice; basta compilare con:

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

Grazie Andy. Usando la tua linea di comando, ho ancora lo stesso errore esatto. – Geremy

2

Questo metodo sembra buona:

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

È necessario specificare anche le bandiere di collegamento:

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