我是ubuntu 16.04,官方教程如下:https://www.techotopia.com/index.php/Installing_and_Using_GNUstep_and_Objective-C_on_Linux
使用这个教程必须安装
sudo apt install gobjc gobjc++ gnustep-make gnustep-devel
安装完后配置编译环境:
. /usr/share/GNUstep/Makefiles/GNUstep.sh
然后编写代码hello.h
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"hello world");
[pool drain];
return 0;
}
然后使用观望编译的方式报错:
gcc `gnustep-config --objc-flags` -lgnustep-base hello.m -o hello
错误如下:
/test/object-c/hello.m:4:对‘objc_get_class’未定义的引用
/test/object-c/hello.m:4:对‘objc_msg_lookup’未定义的引用
/test/object-c/hello.m:4:对‘objc_msg_lookup’未定义的引用
/test/object-c/hello.m:5:对‘NSLog’未定义的引用
/test/object-c/hello.m:6:对‘objc_msg_lookup’未定义的引用
/tmp/ccFeqgkG.o:在函数‘__objc_gnu_init’中:
/test/object-c/hello.m:9:对‘__objc_exec_class’未定义的引用
/tmp/ccFeqgkG.o:(.data.rel+0x0):对‘__objc_class_name_NSConstantString’未定义的引用
/tmp/ccFeqgkG.o:(.data.rel+0x8):对‘__objc_class_name_NSAutoreleasePool’未定义的引用
collect2: error: ld returned 1 exit status
网上搜了一下,解决方案就是如下:
gcc `gnustep-config --objc-flags` -Wl,--no-as-needed -lobjc -lgnustep-base hello.m -o hello.o
或者
gcc hello.m `gnustep-config --objc-flags` -lgnustep-base `gnustep-config --objc-libs` -Wl,--no-as-needed -o hello.o
比原来多添加了-Wl,--no-as-needed -lobjc
最后使用 ./hello.o执行就可以了
这个问题就解决了:
参考:https://blog.youkuaiyun.com/SweetTool/article/details/89609214
https://stackoverflow.com/questions/11425120/objective-c-on-linux-compile-error