我正在学习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网页,但我还没有找到解决方法。所以任何帮助都将不胜感激。
谢谢!
答案 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
,并且无需任何额外的交互即可编译包。