Geremy
Geremy

Reputation: 2455

Objective-C on Linux Compile Error

There seem to be quite a few tutorials on how to do this, each slightly different. I'm hoping someone can recognize the error messages I'm getting and point me in the right direction.

My code, h.m is:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 NSLog (@"hello world");
 [pool drain];
 return 0;
}

Before I compile, I enter in the console:

. /usr/share/GNUstep/Makefiles/GNUstep.sh

I try to compile with:

gcc `gnustep-config --objc-flags` -lgnustep-base h.m -o hello

and get:

/tmp/ccgLOnpY.o: In function `main':
/home/ge/objective-c/h.m:4: undefined reference to `objc_get_class'
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup'
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup'
/home/ge/objective-c/h.m:5: undefined reference to `NSLog'
/home/ge/objective-c/h.m:6: undefined reference to `objc_msg_lookup'
/tmp/ccgLOnpY.o: In function `__objc_gnu_init':
/home/ge/objective-c/h.m:8: undefined reference to `__objc_exec_class'
/tmp/ccgLOnpY.o:(.data.rel+0x0): undefined reference to `__objc_class_name_NSConstantString'
/tmp/ccgLOnpY.o:(.data.rel+0x8): undefined reference to `__objc_class_name_NSAutoreleasePool'
collect2: ld returned 1 exit status

Can somebody point me in the right direction?

TIA

Upvotes: 10

Views: 6406

Answers (4)

leo
leo

Reputation: 21

This method seem good:

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello

Upvotes: 2

Oleg
Oleg

Reputation: 81

You need to also specify the link flags:

gcc h.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \
-lobjc -lgnustep-base -o hello

Upvotes: 5

andyvn22
andyvn22

Reputation: 14824

You'll need to link to libobjc. The fix is pretty simple; just compile with:

gcc h.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello

Upvotes: 12

another.anon.coward
another.anon.coward

Reputation: 11405

The reason for the linking error is most likely due to the behaviour of linker to link the libraries only after seeing the symbols in compilation prior to linking the library. As h.m appears after -lgnustep-base the library is not linked as the symbols in library are not yet encountered. You can either instruct the linker to link the libraries even if the symbols are not encountered using -Wl,--no-as-needed linker option as

gcc `gnustep-config --objc-flags` -Wl,--no-as-needed -lgnustep-base  h.m -o hello

Or better yet just move the source to the beginning of the compilation command as

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello

The observed linker behaviour is to discourage looking up & linking symbols of library which may not be needed but are linked in the compilation anyway, thus the second option would be recommended way of doing rather than added the -Wl, --no-as-needed linker option.
Hope this helps!

Upvotes: 36

Related Questions