【问题标题】:Objective-C on Linux Compile ErrorLinux 上的 Objective-C 编译错误
【发布时间】:2012-07-10 15:02:00
【问题描述】:

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

我的代码,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:在函数“main”中: /home/ge/objective-c/h.m:4:未定义对“objc_get_class”的引用 /home/ge/objective-c/h.m:4:未定义对“objc_msg_lookup”的引用 /home/ge/objective-c/h.m:4:未定义对“objc_msg_lookup”的引用 /home/ge/objective-c/h.m:5:对“NSLog”的未定义引用 /home/ge/objective-c/h.m:6:未定义对“objc_msg_lookup”的引用 /tmp/ccgLOnpY.o:在函数“__objc_gnu_init”中: /home/ge/objective-c/h.m: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

【问题讨论】:

标签: objective-c linux ubuntu gnustep


【解决方案1】:

这个方法看起来不错:

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

【讨论】:

    【解决方案2】:

    您还需要指定链接标志:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢安迪。使用你的命令行,我仍然得到同样的错误。
      【解决方案4】:

      链接错误的原因很可能是由于链接器在链接库之前看到编译中的符号后才链接库的行为。由于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 链接器选项。
      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多