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:
-
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'
-
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?
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
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)
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
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ń.
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ć ^^
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;
}
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