Linux编译错误的Objective-C

时间:2012-07-11 03:29:22

标签: objective-c linux ubuntu gnustep

似乎有很多关于如何做到这一点的教程,每个都略有不同。我希望有人能够认出我收到的错误信息并指出我正确的方向。

我的代码,h.m是:

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

在编译之前,我进入控制台:

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

我尝试编译:

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

并获得:

/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

有人能指出我正确的方向吗?

TIA

4 个答案:

答案 0 :(得分:30)

链接错误的原因很可能是由于链接器仅在链接库之前在编译中看到符号后链接库的行为。由于h.m -lgnustep-base之后未显示库,因为尚未遇到库中的符号。您可以指示链接器链接库,即使使用-Wl,--no-as-needed链接器选项未遇到符号

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

或者更好的是将源代码移动到编译命令的开头

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

观察到的链接器行为是为了阻止查找&amp;链接库的符号可能不需要但在编译中链接,因此第二个选项是推荐的做法,而不是添加-Wl, --no-as-needed链接器选项。
希望这有帮助!

答案 1 :(得分:10)

您需要链接到libobjc。修复非常简单;只需编译:

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

答案 2 :(得分:5)

您还需要指定链接标志:

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

答案 3 :(得分:2)

这种方法似乎很好:

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