9

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

我的代码,嗯是:

#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:在函数“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

4

4 回答 4

33

链接错误的原因很可能是由于链接器在链接库之前仅在看到编译中的符号之后才链接库的行为。正如库未链接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

观察到的链接器行为是阻止查找和链接库的符号,这些符号可能不需要,但无论如何都在编译中链接,因此建议使用第二种方法而不是添加-Wl, --no-as-needed链接器选项。
希望这可以帮助!

于 2012-07-11T04:20:15.303 回答
11

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

gcc h.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello
于 2012-07-11T03:42:04.493 回答
5

您还需要指定链接标志:

gcc h.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \
-lobjc -lgnustep-base -o hello
于 2013-05-23T05:14:10.270 回答
2

这个方法看起来不错:

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello
于 2013-03-03T09:15:13.687 回答