Компиляция проекта Objective-C в Linux (Ubuntu)
Как сделать проект проекта 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;
}
Я попробовал два подхода к его компиляции:
-
Чистый 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'
-
Я создал файл 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'
У вас есть идея, как решить эту проблему?
Ответы
Ответ 1
Это правильно. В обоих случаях вы не включали Fraction.m
в список файлов, которые должны быть скомпилированы, поэтому он не может найти реализацию класса Fraction
Из комментария эта команда работает
gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
Ответ 2
Я не специалист по написанию файлов make, как это, я нахожу просто написание следующих работ на 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 и объектных c-пакетов для установки (я просто установил больше пакетов, которые выглядели актуальными случайным образом, пока они не сработали)
Ответ 3
файл 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
Ответ 4
Подход, с которым я только что работал, был (в Ubuntu, который тесно связан с Debian):
- Используйте Synaptic для установки всех вероятных пакетов GnuStep;
- Источник (
.
) запускать GnuStep script, /usr/share/GNUstep/Makefiles/GNUstep.sh
(это может идти в .profile
или .bashrc
или что-то, поэтому вам не нужно делать это вручную каждый раз)
- Создайте
GNUmakefile
в соответствии с инструкциями в Первый инструмент
Это позволило мне успешно создавать программы командной строки.
Ответ 5
Добавьте Fraction.m в файл make,
включают ${GNUSTEP_MAKEFILES}/common.make
TOOL_NAME = main
main_OBJC_FILES = main.m Fraction.m
включают ${GNUSTEP_MAKEFILES}/tool.make
а затем сделаем ^^
Ответ 6
Просто добавьте 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;
}