2009-10-13 6 views
18

Come realizzare un progetto Objective-C su Ubuntu?Compilazione del progetto Objective-C su Linux (Ubuntu)

I miei file sono:

Fraction.h

#import <Foundation/NSObject.h> 

    @interface Fraction: NSObject { 
     int numerator; 
     int denominator; 
    } 

    -(void) print; 
    -(void) setNumerator: (int) n; 
    -(void) setDenominator: (int) d; 
    -(int) numerator; 
    -(int) denominator; 
    @end 

Fraction.m

#import "Fraction.h" 
    #import <stdio.h> 

    @implementation Fraction 
    -(void) print { 
     printf("%i/%i", numerator, denominator); 
    } 

    -(void) setNumerator: (int) n { 
     numerator = n; 
    } 

    -(void) setDenominator: (int) d { 
     denominator = d; 
    } 

    -(int) denominator { 
     return denominator; 
    } 

    -(int) numerator { 
     return numerator; 
    } 
    @end 

main.m

#import <stdio.h> 
    #import "Fraction.h" 

    int main(int argc, const char *argv[]) { 
     // create a new instance 
     Fraction *frac = [[Fraction alloc] init]; 

     // set the values 
     [frac setNumerator: 1]; 
     [frac setDenominator: 3]; 

     // print it 
     printf("The fraction is: "); 
     [frac print]; 
     printf("\n"); 

     // free memory 
     [frac release]; 

     return 0; 
    } 

ho provato due approcci per compilarlo:

  1. Pure gcc:

    $ sudo apt-get install gobjc gnustep gnustep-devel 
    $ gcc `gnustep-config --objc-flags` -o main main.m -lobjc -lgnustep-base 
    /tmp/ccIQKhfH.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction' 
    
  2. ho creato un GNUmakefile Makefile:

    include ${GNUSTEP_MAKEFILES}/common.make 
    
    TOOL_NAME = main 
    main_OBJC_FILES = main.m 
    
    include ${GNUSTEP_MAKEFILES}/tool.make 
    

    ... e sono corso:

    $ source /usr/share/GNUstep/Makefiles/GNUstep.sh 
    $ make 
    Making all for tool main... 
    Linking tool main ... 
    ./obj/main.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction' 
    

Quindi, in entrambi i casi il compilatore si blocca a

undefined reference to `__objc_class_name_Fraction' 

Hai e idea di come risolvere questo problema?

risposta

9

È giusto.In entrambi i casi non ha incluso Fraction.m nella tua lista di file da compilare, in modo che non riesce a trovare l'implementazione della classe Fraction

Dal commento, questo comando funziona

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base 
+0

in realtà ho un errore di linker. newacct ha ragione. Non sono sicuro di includere anche . Penso che questo sia fornito solo su MacOS non in GNUSTEP. –

+1

@Johannes Rudolphp: ho cambiato main.m in * .m e ha funzionato! – Alex

4

io non sono un esperto in scrittura i file di make del genere, trovo semplicemente digitando le seguenti opere su Ubuntu abbastanza bene:

gcc -I /usr/include/GNUstep/ -I /usr/include/mysql -L /usr/lib/GNUstep/\ 
    -lgnustep-base -lmysqlclient\ 
    -g -ggdb\ 
    -fconstant-string-class=NSConstantString -o test *.m 

io lo utilizzo su questo progetto:

http://github.com/uptecs/SmsgateDelivery/

Se il comando GCC sopra non funziona non è stato installato abbastanza pacchetti, usare apt-cache per cercare ulteriori gcc e pacchetti oggettivi C da installare (Ho appena installato più pacchetti che sembravano rilevanti a caso fino a quando non lavorato)

2

L'approccio ho appena ricevuto di lavoro è stato (in Ubuntu, che è strettamente correlato a Debian):

  • Usa Synaptic per installare tutti i pacchetti gnustep probabili dall'aspetto;
  • Fonte (.) lo script di avvio GNUstep, /usr/share/GNUstep/Makefiles/GNUstep.sh (questo può andare in .profile o .bashrc o qualcosa di così non dovete farlo manualmente ogni volta)
  • Creare un GNUmakefile secondo le istruzioni in A First Tool

Ciò mi ha permesso di creare con successo programmi da riga di comando.

2

Aggiungere Fraction.m nel make file,


includono $ {} GNUSTEP_MAKEFILES /common.make

tool_name = principali

main_OBJC_FILES = main.m Fraction.m

include $ {GNUSTEP_MAKEFILES} /tool.make


e poi fare ^^

2

Basta aggiungere Fraction.m in main.m invece di aggiungere Fraction.h in main.m. E questo funzionerà. Quanto segue è il file main.m ho usato:

#import <stdio.h> 
#import "Fraction.m" 

int main(int argc, const char *argv[]) { 
    //create a new instance 
    Fraction *frac = [[Fraction alloc] init]; 

    //set the values 
    [frac setNumerator: 1]; 
    [frac setDenominator: 3]; 

    //print it 
    printf("The fraction is : "); 
    [frac print]; 
    printf("\n"); 

    //free memory 
    [frac release]; 

    return 0; 
} 
3

il file marca:

include ${GNUSTEP_MAKEFILES}/common.make 

APP_NAME=Fraction 
Fraction_HEADERS = Fraction.h 
Fraction_OBJC_FILES = main.m Fraction.m 


include ${GNUSTEP_MAKEFILES}/application.make