eze*_*uli 10 compiler-construction ubuntu linker objective-c 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;
}
Run Code Online (Sandbox Code Playgroud)
编译器的输出是:
/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)
Run Code Online (Sandbox Code Playgroud)
我用来编译的命令是
clang -I /usr/include/GNUstep/ test.m -o test
Run Code Online (Sandbox Code Playgroud)
使用-I指令包含GNUStep库(否则,Clang无法找到Foundation.h).
我搜索了我的问题,并访问了GNUStep和Clang网页,但我还没有找到解决方案.所以任何帮助将不胜感激.
谢谢!
问题是链接器没有使用库gnustep-base.因此,解决方法是使用选项-Xlinker,它将参数发送到clang使用的链接器:
clang -I /usr/include/GNUstep/ -Xlinker -lgnustep-base test.m -o test
Run Code Online (Sandbox Code Playgroud)
声明"-X link -lgnustep-base"成为了魔术.但是,我遇到了与表示Objective-C中的字符串的类相关的此命令的问题:
./test: Uncaught exception NSInvalidArgumentException, reason: GSFFIInvocation:
Class 'NXConstantString'(instance) does not respond to forwardInvocation: for
'hasSuffix:'
Run Code Online (Sandbox Code Playgroud)
我可以解决它添加参数"-fconstant-string-class = NSConstantString":
clang -I /usr/include/GNUstep/ -fconstant-string-class=NSConstantString \
-Xlinker -lgnustep-base test.m -o test
Run Code Online (Sandbox Code Playgroud)
另外,我尝试过一些Objective-C 2.0代码,它似乎有效.
感谢您的帮助!
你可以尝试gcc编译器:
首先安装GNU Objective-C Runtime:sudo apt-get install gobjc
然后编译:gcc -o hello hello.m -Wall -lobjc