当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

如何在Ubuntu上执行Objective-C项目?

我的文件是:

分数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

分数

    #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

主目录

    #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'

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

最佳方法

这是正确的。在这两种情况下,您都没有在要编译的文件列表中包含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和Objective C软件包(我只是随机安装了更多看上去相关的软件包,直到它起作用为止)

第三种方法

生成文件:

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问答整理, 博文地址: https://ubuntuqa.com/article/10210.html,未经允许,请勿转载。