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

Ale*_*lex 18 linux ubuntu compilation objective-c

如何让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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

的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;
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法来编译它:

  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'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我创建了一个GNUmakefile Makefile:

    include ${GNUSTEP_MAKEFILES}/common.make
    
    TOOL_NAME = main
    main_OBJC_FILES = main.m
    
    include ${GNUSTEP_MAKEFILES}/tool.make
    
    Run Code Online (Sandbox Code Playgroud)

    ...并跑了:

    $ 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'
    
    Run Code Online (Sandbox Code Playgroud)

因此,在这两种情况下编译器都会陷入困

    undefined reference to `__objc_class_name_Fraction'
Run Code Online (Sandbox Code Playgroud)

你有没有想法如何解决这个问题?

new*_*cct 9

这是正确的.在这两种情况下,您都没有包含Fraction.m在要编译的文件列表中,因此无法找到该类的实现Fraction

从评论中,此命令有效

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
Run Code Online (Sandbox Code Playgroud)