如何让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'
我创建了一个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'
您是否知道如何解决此问题?
答案 0 :(得分:9)
没错。在这两种情况下,您都没有在要编译的文件列表中包含Fraction.m
,因此无法找到类Fraction
的实现
从评论中,此命令有效
gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
答案 1 :(得分:4)
我不是那样编写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软件包进行安装(我刚刚安装了更多随机相关的软件包,直到它工作为止)
答案 2 :(得分:3)
制作文件:
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 :(得分:2)
我刚刚开始工作的方法是(在Ubuntu中,与Debian密切相关):
.
)GnuStep启动脚本/usr/share/GNUstep/Makefiles/GNUstep.sh
(这可以进入.profile
或.bashrc
或其他内容,因此您不必每次都手动执行时间)GNUmakefile
这使我成功构建了命令行程序。
答案 4 :(得分:2)
在make文件中添加Fraction.m,
包括$ {GNUSTEP_MAKEFILES} /common.make
TOOL_NAME = main
main_OBJC_FILES = main.m Fraction.m
包括$ {GNUSTEP_MAKEFILES} /tool.make
然后制作^^
答案 5 :(得分:2)
只需在main.m中添加Fraction.m,而不是在main.m中添加Fraction.h。这将有效。以下是我使用的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;
}