在Linux上编译Objective-C项目(Ubuntu)

时间:2009-10-13 06:20:06

标签: objective-c linux ubuntu compilation

如何让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'
    
  3. 因此,在这两种情况下,编译器都会陷入

        undefined reference to `__objc_class_name_Fraction'
    

    您是否知道如何解决此问题?

6 个答案:

答案 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密切相关):

  • 使用Synaptic安装所有看起来很可能的GnuStep软件包;
  • 来源(.)GnuStep启动脚本/usr/share/GNUstep/Makefiles/GNUstep.sh(这可以进入.profile.bashrc或其他内容,因此您不必每次都手动执行时间)
  • 根据A First Tool
  • 中的说明创建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;
}