Kompilowanie projektu Objective-C na Linuksie (Ubuntu)

Jak sprawić, by projekt Objective-C działał na Ubuntu?

Moje Pliki to:

ułamek.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

ułamek.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ść do kompilacji:

  1. Czysty 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 bieg:

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

Więc w obu przypadkach kompilator utknął w

    undefined reference to `__objc_class_name_Fraction'

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

Author: Alex, 2009-10-13

6 answers

To prawda. W obu przypadkach nie umieściłeś Fraction.m na liście plików do skompilowania, więc nie możesz znaleźć implementacji klasy Fraction

Z komentarza to polecenie działa

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
 9
Author: newacct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 18:36:54

Nie jestem ekspertem w pisaniu takich plików make, uważam, że po prostu wpisanie następujących rzeczy działa 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 w tym projekcie:

Http://github.com/uptecs/SmsgateDelivery/

Jeśli powyższe polecenie GCC nie działa, nie zainstalowałeś wystarczającej ilości pakietów, użyj apt-cache, aby wyszukać więcej pakietów gcc i objective c do zainstalowania (zainstalowałem tylko więcej pakietów, które wyglądały losowo, dopóki nie zadziałały)

 4
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-13 08:58:19

Plik make:

include ${GNUSTEP_MAKEFILES}/common.make

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


include ${GNUSTEP_MAKEFILES}/application.make
 3
Author: basemi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 02:53:10

Podejście, które właśnie uruchomiłem, było (w Ubuntu, które jest blisko związane z Debianem):

  • Użyj Synaptic, aby zainstalować wszystkie prawdopodobnie wyglądające Pakiety GnuStep;
  • Source (. ) skrypt startowy GnuStep, /usr/share/GNUstep/Makefiles/GNUstep.sh (może wejść w .profile lub .bashrc lub coś takiego, więc nie musisz robić tego ręcznie za każdym razem)
  • Utwórz GNUmakefile zgodnie z instrukcjami w pierwsze narzędzie

To pozwoliło mi z powodzeniem budować programy wiersza poleceń.

 2
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-01 22:11:34

Dodaj Ułamek.m w pliku make,


Include ${GNUSTEP_MAKEFILES} / common.marka

TOOL_NAME = main

Main_OBJC_FILES = main.M ułamek.m

Include ${GNUSTEP_MAKEFILES} / tool.marka


A następnie zrobić ^^

 2
Author: gmlee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 23:56:09

Wystarczy dodać ułamek.m in main.m zamiast dodać ułamek.h W main.m. i to zadziała. Poniżej znajduje się główna.plik m, którego 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;
}
 2
Author: Abhishek Mittal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 06:54:58