Компиляция проекта Objective-C для Linux (Ubuntu) - PullRequest
18 голосов
/ 13 октября 2009

Как заставить проект Objective-C работать на Ubuntu?

Мои файлы:

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

Я попробовал два подхода к его компиляции:

  1. Чистый 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. Я создал Makefile для GNUmakefile:

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

    ... и побежал:

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

Так что в обоих случаях компилятор застревает на

    undefined reference to `__objc_class_name_Fraction'

Есть ли у вас идеи, как решить эту проблему?

Ответы [ 6 ]

9 голосов
/ 13 октября 2009

Это правильно. В обоих случаях вы не включили Fraction.m в свой список файлов для компиляции, поэтому он не может найти реализацию класса Fraction

Из комментария эта команда работает

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
4 голосов
/ 13 октября 2009

Я не эксперт в написании таких файлов, я считаю, что достаточно просто набрать на ubuntu следующие работы:

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

Я использую его в этом проекте:

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

Если приведенная выше команда GCC не работает, вы не установили достаточное количество пакетов, используйте apt-cache для поиска большего количества устанавливаемых пакетов gcc и target c (я просто установил больше пакетов, которые выглядели релевантными случайным образом до тех пор, пока они не работали)

3 голосов
/ 21 октября 2012

файл 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
2 голосов
/ 05 января 2011

Просто добавьте Fraction.m в main.m вместо того, чтобы добавить Fraction.h в main.m. И это будет работать. Вот файл main.m, который я использовал:

#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 голосов
/ 17 ноября 2010

Добавить Fraction.m в make-файл,


включает $ {GNUSTEP_MAKEFILES} /common.make

TOOL_NAME = main

main_OBJC_FILES = main.m Fraction.m

включает $ {GNUSTEP_MAKEFILES} /tool.make


, а затем сделать ^^

2 голосов
/ 02 июня 2010

Подход, который я только что получил, был (в Ubuntu, который тесно связан с Debian):

  • Используйте Synaptic для установки всех вероятных пакетов GnuStep;
  • Источник (.) сценария запуска GnuStep, /usr/share/GNUstep/Makefiles/GNUstep.sh (это может указывать на .profile или .bashrc или что-то подобное, поэтому вам не нужно каждый раз делать это вручную)
  • Создание GNUmakefile в соответствии с инструкциями в Первый инструмент

Это позволило мне успешно создавать программы командной строки.

...