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

时间:2012-02-18 00:21:09

标签: objective-c ubuntu compiler-construction linker clang

我正在学习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)。

我已经搜索了我的问题,并访问了GNUStep和Clang网页,但我还没有找到解决方法。所以任何帮助都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:6)

问题是链接器没有使用库gnustep-base。因此,解决方案是使用选项-Xlinker,它将参数发送到clang使用的链接器:

clang -I /usr/include/GNUstep/ -Xlinker -lgnustep-base test.m -o test

声明“-X link -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代码,它似乎有效。

感谢您的帮助!

答案 1 :(得分:1)

你可以试试gcc编译器:
首先安装GNU Objective-C Runtime:sudo apt-get install gobjc
然后编译:{{1​​}}

答案 2 :(得分:0)

您无法使用ObjC 2.0功能,因为您缺少支持这些功能的ObjC运行时。 GCC的运行时间过时且过时,它不支持ObjC 2.0。 Clang / LLVM没有伴随的运行时,你需要从GNUstep安装ObjC2-runtime(可以在这里找到:https://github.com/gnustep/libobjc2)并使用这个运行时重新安装GNUstep。

以下是针对不同Ubuntu版本的一些bash脚本,它们可以为您完成所有操作:

http://wiki.gnustep.org/index.php/GNUstep_under_Ubuntu_Linux

请不要尝试重新发明GNUstep make,而是使用它:

http://www.gnustep.org/resources/documentation/Developer/Make/Manual/gnustep-make_1.html

如果你真的不这么认为,那么这里有一些摘录:

1.2 Makefile的结构

这是一个示例makefile(名为GNUmakefile,强调它依赖于GNU make程序的特殊功能)。

#
# An example GNUmakefile
#

# Include the common variables defined by the Makefile Package
include $(GNUSTEP_MAKEFILES)/common.make

# Build a simple Objective-C program
TOOL_NAME = simple

# The Objective-C files to compile
simple_OBJC_FILES = simple.m

-include GNUmakefile.preamble

# Include in the rules for making GNUstep command-line programs
include $(GNUSTEP_MAKEFILES)/tool.make

-include GNUmakefile.postamble

这是定义项目所需的全部内容。

在您的情况下,将所有simple替换为test,并且您已完成

1.3 Running Make

通常要编译一个使用Makefile包的包,它纯粹是从包的顶级目录中键入make,并且无需任何额外的交互即可编译包。