Linux下的objective-c 的簡單使用和一些問題

我是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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章