问题描述
如何在Ubuntu上执行Objective-C项目?
我的文件是:
分数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
分数
#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
主目录
#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'
-
我创建了一个GNUmakefile Makefile:
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'
您是否知道如何解决此问题?
最佳方法
这是正确的。在这两种情况下,您都没有在要编译的文件列表中包含Fraction.m
,因此找不到Fraction
类的实现。
从注释来看,此命令有效
gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
次佳方法
我不是像这样编写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和Objective C软件包(我只是随机安装了更多看上去相关的软件包,直到它起作用为止)
第三种方法
生成文件:
include ${GNUSTEP_MAKEFILES}/common.make
APP_NAME=Fraction
Fraction_HEADERS = Fraction.h
Fraction_OBJC_FILES = main.m Fraction.m
include ${GNUSTEP_MAKEFILES}/application.make