Linux上的Objective-C编译错误

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

我的代码是hm:

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

在编译之前,我input控制台:

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

我尝试编译:

 gcc `gnustep-config --objc-flags` -lgnustep-base hm -o hello 

并得到:

 /tmp/ccgLOnpY.o:在函数`main'中:
 / home / ge / objective-c / hm:4:对“objc_get_class”的未定义引用
 / home / ge / objective-c / hm:4:对“objc_msg_lookup”的未定义引用
 / home / ge / objective-c / hm:4:对“objc_msg_lookup”的未定义引用
 / home / ge / objective-c / hm:5:对'NSLog'的未定义引用
 / home / ge / objective-c / hm:6:对`objc_msg_lookup'的未定义引用
 /tmp/ccgLOnpY.o:在函数`__objc_gnu_init'中:
 / home / ge / objective-c / hm:8:对`__objc_exec_class'的未定义引用
 /tmp/ccgLOnpY.o:(.data.rel+0x0):未定义的引用'__objc_class_name_NSConstantString'
 /tmp/ccgLOnpY.o:(.data.rel+0x8):未定义的引用“__objc_class_name_NSAutoreleasePool”
 collect2:ld返回1退出状态

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

TIA

链接错误的原因很可能是由于链接器链接库的行为,只有在链接库之前查看编译中的符号之后。 由于hm出现在-lgnustep-base之后, -lgnustep-base库中的符号尚未遇到,所以库不链接。 您可以指示链接程序链接库,即使符号没有遇到使用-Wl,--no-as-needed链接器选项作为

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

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

 gcc hm `gnustep-config --objc-flags` -lgnustep-base -o hello 

所观察到的链接器行为是为了阻止查找和链接库中可能不需要但是在编译中链接的符号,因此,第二种选择将是推荐的方式而不是添加-Wl, --no-as-needed链接器选项。
希望这可以帮助!

你需要链接到libobjc。 修复很简单, 只需编译:

 gcc hm `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello 

您还需要指定链接标志:

 gcc hm `gnustep-config --objc-flags` `gnustep-config --objc-libs` \ -lobjc -lgnustep-base -o hello 

这个方法看起来不错:

 gcc hm `gnustep-config --objc-flags` -lgnustep-base -o hello