2009-10-13 15 views
18

Jak sprawić, by projekt Objective-C działał na Ubuntu?Kompilowanie projektu Objective-C na systemie Linux (Ubuntu)

Moje pliki są:

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

Próbowałem dwóch podejść, aby go skompilować:

  1. Czysta 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. stworzyłem GNUmakefile Makefile:

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

    ... i pobiegł:

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

Tak więc w obu przypadkach kompilator utknie w

undefined reference to `__objc_class_name_Fraction' 

Czy masz i pomysł, jak rozwiązać ten problem?

Odpowiedz

9

W porządku.W obu przypadkach nie uwzględniono Fraction.m na liście plików, które są opracowywane, więc to nie może znaleźć implementację klasy Fraction

Z komentarza, to polecenie działa

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

właściwie to ja się błąd linkera. newacct ma rację. Nie jestem również pewny co do . Myślę, że to tylko w systemie MacOS, a nie w GNUStep. –

+1

@Johannes Rudolphp: Zmieniłem main.m na * .m i zadziałało! – Alex

4

nie jestem ekspertem w pisaniu pliki make tak, ja po prostu znaleźć, wpisując następujące prace na Ubuntu całkiem dobrze:

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 

Używam go na tym projekcie:

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

Jeśli powyższe polecenie GCC nie działa nie masz zainstalowanego na tyle pakietów, użyj apt-cache, aby szukać więcej gcc i obiektywnych pakietów c, aby zainstalować (Właśnie zainstalowałem więcej pakietów, które wyglądały istotne losowo aż do niej pracował)

2

podejście właśnie pracowała (w Ubuntu, które jest ściśle związane z Debianem):

  • Zastosowanie Synaptic aby zainstalować wszystkie prawdopodobne wyglądających paczek gnustep;
  • Źródło (.) skrypt startowy gnustep, /usr/share/GNUstep/Makefiles/GNUstep.sh (można iść do .profile lub .bashrc lub coś więc nie trzeba tego robić ręcznie za każdym razem)
  • Tworzenie GNUmakefile zgodnie z instrukcją w A First Tool

Pozwoliło mi to z powodzeniem tworzyć programy wiersza poleceń.

2

Dodaj Fraction.m w makijażu pliku


to $ {GNUSTEP_MAKEFILES} /common.make

TOOL_NAME = główne

main_OBJC_FILES = main.m Fraction.m

to $ {GNUSTEP_MAKEFILES} /tool.make


a następnie dokonać ^^

2

Wystarczy dodać Fraction.m w main.m zamiast dodać Fraction.h w main.m. I to zadziała. Poniżej znajduje się plik main.m użyłem:

#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

plik Producent:

include ${GNUSTEP_MAKEFILES}/common.make 

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


include ${GNUSTEP_MAKEFILES}/application.make 
Powiązane problemy