Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 770
Geremy Avatar asked Jul 11 '12 03:07

Geremy


4 Answers

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!

like image 142
another.anon.coward Avatar answered Nov 09 '22 05:11

another.anon.coward


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
like image 28
andyvn22 Avatar answered Nov 09 '22 04:11

andyvn22


You need to also specify the link flags:

gcc h.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \
-lobjc -lgnustep-base -o hello
like image 24
Oleg Avatar answered Nov 09 '22 04:11

Oleg


This method seem good:

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello
like image 2
leo Avatar answered Nov 09 '22 05:11

leo