在Linux上编译Objective-C项目(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; } 

我试过两种方法来编译它:

  1. 纯粹的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' 
  2. 我创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密切相关):

  • 使用Synaptic安装所有可能的GnuStep软件包;
  • 源( . )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; }