因此,我安装了Ubuntu和clang3.0,并安装了一个简单的program.m:

#include <Foundation/Foundation.h>
int main()
{
        @autoreleasepool{
            NSLog(@"Hi");
        }

        return 0;
}

我尝试像这样编译它:
clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc

我得到
undefined reference to objc_autoreleasePoolPush
undefined reference to objc_autoreleasePoolPop

所以我已经用谷歌搜索一下并安装objc2并尝试了:
clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc2

但没有任何变化。也许有人解决了同样的问题?

最佳答案

在我的Ubuntu系统上安装libobjc2之后,您的first.m文件的副本将通过以下代码行为我编译:

clang first.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \
-I /usr/include/GNUstep/ -lgnustep-base

但是也许这只是命令行末尾的错字?

第一个示例末尾的-objc和第二个示例末尾的-objc2指示clang编译器分别创建名称为bjc和bjc2的可执行文件。你是说-lobj吗?我认为obj库中的链接对于获取Objective-C运行时库至关重要。即使使用libobjc2项目,生成的库仍名为libobjc.so.x.y。如果您的命令不包含-lobjc,则看不到如何正确链接。我可能是错的,但是没有它对我来说是行不通的。

10-08 09:23