Naveen Mathew
Naveen Mathew

Reputation: 103

Compiling objective-c programs without gnustep on ubuntu

is there any way to compile objective c programs on ubuntu without the use of GNUStep? I want to use the default C standard libraries and all but with Objective-C's OOB syntax. The problem I am having now is once I have all the methods up, I need a way to call them. In Mac I would just alloc and init it but on Linux when I try to compile this, clang just gives me an error.

#include <stdio.h> // C standard IO library (for printf)
#include <stdlib.h> // C standard library
// Interface
@interface test
 -(void)sayHello :(char *)message;
@end

// Implementation
@implementation test
 -(void)sayHello :(char *)message {
  printf("%s", message);
 }

int main(int argc, char *argv[]) {
 test *test = [[test alloc] init];
 [test sayHello:"Hello world"];
}

Upvotes: 5

Views: 1034

Answers (2)

AlexDarkVoid
AlexDarkVoid

Reputation: 542

Good question - it got me to dig into the matters myself, since I want to rewrite several old Python projects in a normal language (C/ObjC), so I aim both to stay away from Crap++ and avoid GNUstep overhead. Here goes my try-and-test solution:

Foo.h:

#import <objc/Object.h>

@interface Foo: Object
{
@private
    int
        bar;
}

+ (id) alloc;
+ (id) new;

- (id) init;

- (id) set_bar: (int)value;
- (int) get_bar;

@end

Foo.m:

#import <stdio.h>
#import <objc/runtime.h>

#import "Foo.h"

@implementation Foo

+ (id) alloc
{
    puts(__func__);

    return class_createInstance(self, 0);
}

+ (id) new
{
    return [[self alloc] init];
}

- (id) init
{
    puts(__func__);

    bar = 31;

    return self;
}

- (id) set_bar: (int)value
{
    puts(__func__);

    bar = value;

    return self;
}

- (int) get_bar
{
    puts(__func__);

    return bar;
}

@end

main.m:

#import <stdio.h>
#import "Foo.h"

int
    main
        ()
{
    id
        foo = [Foo new];

    printf("old bar: %i\n", [foo get_bar]);

    [foo set_bar: 10];

    printf("new bar: %i\n", [foo get_bar]);

    return 0;
}

Makefile:

run: main.o Foo.o
    gcc $^ -o $@ -lobjc

main.o: main.m Foo.h
    gcc -c $< -o $@

Foo.o: Foo.m Foo.h
    gcc -c $< -o $@

The output I've got:

+[Foo alloc]
-[Foo init]
-[Foo get_bar]
old bar: 31
-[Foo set:bar:]
-[Foo get_bar]
new bar: 10

Looks like it works!

Upvotes: 2

Simon Curd
Simon Curd

Reputation: 850

You can compile objective-c with gcc, but remember to use the -lobjc switch so the compiler knows what language you're using.

You'll also need to include the following header:

    #import <objc/Object.h>

...and extend Object from your interface. See the hello world example for objective-c here:

http://en.m.wikipedia.org/wiki/List_of_Hello_world_program_examples#O

Upvotes: 1

Related Questions