2009-10-13 6 views
18

Wie funktioniert ein Objective-C-Projekt unter Ubuntu?Kompilieren von Objective-C-Projekt unter Linux (Ubuntu)

Meine Dateien sind:

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; 
    } 

Ich habe zwei Ansätze versucht, es zu kompilieren:

  1. Reines 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. ich GNUmakefile Makefile erstellt:

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

    ... und lief:

    $ 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' 
    

Also in beiden Fällen Compiler wird bei

stecken
undefined reference to `__objc_class_name_Fraction' 

Haben Sie und Idee, wie dieses Problem zu lösen?

Antwort

9

Es ist richtig.In beiden Fällen haben Sie sind nicht Fraction.m in der Liste der Dateien erstellt werden, so dass es nicht die Implementierung der Klasse Fraction

Aus dem Kommentar finden, dieser Befehl funktioniert

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

es i eigentlich ein Linker Fehler. Newacct hat Recht. Ich bin nicht sicher über die Include auch. Ich denke das ist nur auf MacOS nicht in GNUStep vorgesehen. –

+1

@Johannes Rudolphp: Ich habe main.m in * .m geändert und es hat funktioniert! – Alex

4

Ich bin nicht ein Experte auf die make-Dateien wie das Schreiben, finde ich recht gut die folgenden Arbeiten auf ubuntu einfach eingeben:

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 

ich bin mit zu diesem Projekt:

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

Wenn der oben genannte GCC-Befehl nicht funktioniert, hast nicht genug Pakete installiert, verwenden Sie apt-cache für mehr gcc und Objective-C-Pakete zu suchen, um zu installieren (ich nur mehr Pakete installiert, die nach dem Zufallsprinzip, bis sie relevant angesehen I (in Ubuntu gearbeitet)

2

Der Ansatz gerade war, wurde Arbeiten, die auf Debian eng verwandt ist):

  • Verwenden Synaptische alle wahrscheinlich aussehende GNUstep Pakete zu installieren;
  • Quelle (.) das GNUstep Startskript, /usr/share/GNUstep/Makefiles/GNUstep.sh (dies kann .profile oder .bashrc oder etwas geht in so dass Sie es nicht tun müssen, um jedes Mal manuell)
  • erstellen GNUmakefile gemäß den Anweisungen in A First Tool

Dies ermöglichte mir erfolgreich Befehlszeilenprogramme zu erstellen.

2

hinzufügen Fraction.m in makefile,


umfassen $ {GNUSTEP_MAKEFILES} /common.make

TOOL_NAME = main

main_OBJC_FILES = main.m Fraction.m

enthalten $ {GNUSTEP_MAKEFILES}/tool.make


und dann machen ^^

2

Gerade Fraction.m in main.m hinzufügen statt Fraction.h in main.m. hinzufügen Und das wird funktionieren. Im Folgenden wird die main.m Datei i verwendet:

#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

die Make-Datei:

include ${GNUSTEP_MAKEFILES}/common.make 

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


include ${GNUSTEP_MAKEFILES}/application.make