objective-c – 使用Clang(Ubuntu)编译Objective C时出现的问题

我正在学习Objective-C语言.由于我没有Mac,我正在Ubuntu 11.04平台上编译和运行我的代码.

到目前为止,我使用gcc编译.我已经安装了GNUStep,一切正常.但是,我开始尝试一些Objective-C 2.0功能,如@property和@synthesize,gcc不允许.

所以我试图用Clang编译代码,但是似乎没有将代码链接到GNUStep库,甚至没有一个简单的Hello World程序.

例如,如果我编译以下代码

#import <Foundation/Foundation.h>

int main(void) {
  NSLog(@"Hello World!");
  return 0;
}

编译器的输出是:

/tmp/cc-dHZIp1.o: In function `main':
test.m:(.text+0x1f): undefined reference to `NSLog'
/tmp/cc-dHZIp1.o: In function `.objc_load_function':
test.m:(.text+0x3c): undefined reference to `__objc_exec_class'
collect2: ld returned 1 exit status
clang: error: linker (via gcc) command Failed with exit code 1 (use -v to see invocation)

我用来编译的命令是

clang -I /usr/include/GNUstep/ test.m -o test

使用-I指令来包含GNUStep库(否则,Clang无法找到Foundation.h).

我已经google了我的问题,并访问了GNUStep和Clang网页,但我还没有找到一个解决方案.所以任何帮助将不胜感激.

谢谢!

解决方法

问题是连接器没有使用库gnustep-base.所以解决方案是使用选项-Xlinker,它发送参数到clang使用的链接器:
clang -I /usr/include/GNUstep/ -Xlinker -lgnustep-base test.m -o test

语句“-X linker -lgnustep-base”使之成为魔术.但是,我在与Objective-C中表示一个字符串的类相关的命令有问题:

./test: Uncaught exception NSinvalidargumentexception,reason: GSFFIInvocation:
Class 'NXConstantString'(instance) does not respond to forwardInvocation: for
'hasSuffix:'

我可以解决添加参数“-fconstant-string-class = NSConstantString”:

clang -I /usr/include/GNUstep/ -fconstant-string-class=NSConstantString \
-Xlinker -lgnustep-base test.m -o test

另外,我已经尝试了一些Objective-C 2.0的代码,它似乎工作.

感谢您的帮助!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...