如何使一个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'
我创build了一个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和目标c包来安装(我只是安装了更多的包,看起来相关的随机直到它工作)
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
我刚开始工作的方法是(在Ubuntu中,与Debian密切相关):
.
)GnuStep启动脚本,/ /usr/share/GNUstep/Makefiles/GNUstep.sh
GNUstep/Makefiles/GNUstep.sh(这可以进入.profile
或.bashrc
什么的,所以你不必手动每次做) GNUmakefile
这使我成功地建立了命令行程序。
在make文件中添加Fraction.m,
包括$ {GNUSTEP_MAKEFILES} /common.make
TOOL_NAME = main
main_OBJC_FILES = main.m Fraction.m
包括$ {GNUSTEP_MAKEFILES} /tool.make
然后制作^^
只需在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; }