2009-10-13 84 views
18

如何使Objective-C项目在Ubuntu上运行?编译Linux上的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. 我创建了一个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' 

你有和知道如何解决这个问题?

回答

9

是的。在这两种情况下,你没有包括在Fraction.m文件列表进行编译,所以它不能找到类Fraction

实施从评论,此命令的工作

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base 
+0

实际上它我链接错误。 newacct是对的。 我也不确定包含。我认为这只在MacOS上提供,不在GNUStep中。 – 2009-10-13 07:25:53

+1

@Johannes Rudolphp:我将main.m更改为* .m,它工作正常! – Alex 2009-10-13 10:08:41

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

我刚刚工作是该方法(在Ubuntu,这是密切相关的Debian):

  • 使用Synaptic来安装所有可能的前瞻性GNUstep的包;
  • 源(.)GNUstep的启动脚本,/usr/share/GNUstep/Makefiles/GNUstep.sh(这个可以进入.profile.bashrc什么的,这样你就不必每次做手工)
  • 根据指令A First Tool
  • 创建 GNUmakefile

这让我成功地构建命令行程序。

2

添加Fraction.m make文件,


包括$ {} GNUSTEP_MAKEFILES /common.make

TOOL_NAME =主

main_OBJC_FILES =的main.m Fraction.m

include $ {GNUSTEP_MAKEFILES} /tool.make


,然后作出^^

2

在main.m文件只需添加Fraction.m,而不是添加Fraction.h在main.m.这将工作。以下是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; 
} 
3

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