我是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.csdn.net/SweetTool/article/details/89609214
https://stackoverflow.com/questions/11425120/objective-c-on-linux-compile-error