2017-10-09 59 views
-1

我想了解Objective-C是如何工作的,我發現的最簡單的例子是從https://codeseekah.com/2012/09/12/compiling-objective-c-without-a-gui/;不幸的是,我無法完成它的編譯(實際上,鏈接)。在Ubuntu上構建簡單的Objective-C示例與clang(鏈接失敗)?

首先,我使用Ubuntu 14.04(64位),在這裏我已經安裝:

sudo apt-get install clang-3.5 libobjc-4.8-dev 

然後,我有(略作修改)從this gist引用的頁面文件,因此,你可以這樣做:

cd /tmp 
git clone https://gist.github.com/dc0b573ae8ef2424aaeb043a6014b7fd.git testobjc 
cd testobjc 
make 

Makefile有被修改爲使用當前安裝的clang-3.5

第一個問題我有,是:

main.m:45:26: error: class method '+new' not found (return type defaults to 'id') [-Werror,-Wobjc-method-access] 
    Person *brad = [Person new]; 

我發現Unable to compile Objective-C code on Ubuntu

+(ID)新的NSObject類的功能。但是,您正在創建一個運行時對象的子類。要使用您在OS X中習慣使用的大多數Apple方法,您需要改爲NSObject的子類。
您仍然可以在使用GNU運行時的同時使用Foundation框架。它應該可用。還有,你可以在這裏使用一個參考:blog.lyxite.com/2008/01/...

這最後是死鏈接,但複製的http://www.cnblogs.com/jack204/archive/2012/03/21/2410095.html

編譯Objective-C程序在Linux上,GNUstep的需要安裝

後來我發現How to instantiate a class in Objective-C that don't inherit from NSObject

你絕對可以這樣做。你的類只需要實現+ alloc本身,就像NSObject所做的那樣。在基礎上,這只是使用malloc()來獲取足夠大的內存以適應定義類的實例的結構。

原來這就是我不明白:

  • 如果在GNUstep上的GNU/Linux提供基礎Objective-C的框架,那麼是什麼樣的libobjc作用?!

由於沒有這些zoneAlloc函數(需要init/alloc)等都是可用的與安裝在上述兩個包,我沒有grep -r " id" //usr/lib/gcc/x86_64-linux-gnu/4.8/include/objc,發現有一個返回id函數class_createInstance,因此通過定義一個使用它的方法new,編譯器不再在編譯步驟中生成錯誤消息。

不過,它無法在鏈接步驟 - 全力打造日誌也是要點(爲make.log) - 有:

/usr/bin/ld: cannot find -lobjc 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [all] Error 1 

嗯,首先,libobjc.so在目錄/usr/lib/x86_64-linux-gnu

$ ls -la /usr/lib/x86_64-linux-gnu/libobjc* 
lrwxrwxrwx 1 root root  19 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc_gc.so.4 -> libobjc_gc.so.4.0.0 
-rw-r--r-- 1 root root 267552 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc_gc.so.4.0.0 
lrwxrwxrwx 1 root root  16 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc.so.4 -> libobjc.so.4.0.0 
-rw-r--r-- 1 root root 112536 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc.so.4.0.0 

...並在Makefile中,我試圖通過這兩個LD_LIBRARY_PATHLIBRARY_PATH設置爲/usr/lib/x86_64-linux-gnu運行clang命令 - 一nd我也用「其他庫路徑」開關-L(在LDFLAGS)指定它。 的這一切似乎是由當時的鏈接命令"/usr/bin/ld"運行被忽略,但是,這並不重要,因爲鏈接命令本身有這個在它的參數:

... -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu ... 

...這的確路徑確實擴大到/usr/lib/x86_64-linux-gnu(檢查它與readlink -f),這是libobjc.so.*是。但鏈接器命令仍然失敗?!

所以我的第二個問題是:

  • 爲什麼不ld找到libobjc.so.*,即使/usr/lib/x86_64-linux-gnu它位於其命令行參數中指定通過-L - 什麼,我需要做的,讓這個程序鏈接?
+0

我期待這個問題的原因是多方面的一個closevote,但絕對不是「無關」?有人可以解釋這是如何脫離主題,我可以在哪裏發佈它(如果在Stack Exchange上有這樣的網站?)謝謝! – sdaau

回答

0

哦,好吧,事實證明,鏈接階段可以通過符號鏈接來解決;我第一次嘗試用ld進行測試,並在第一次我得到:

$ ld -L/usr/lib/x86_64-linux-gnu -lobjc 
ld: cannot find -lobjc 

...然而,有明確的路徑,然後ld不抱怨「找不到」了:

$ ld -v /usr/lib/x86_64-linux-gnu/libobjc.so.4 
GNU ld (GNU Binutils for Ubuntu) 2.24 
ld: warning: cannot find entry symbol _start; not setting start address 

所以,當我看着目錄更加緊密:

$ (cd /usr/lib/x86_64-linux-gnu; ls libobjc*) 
libobjc_gc.so.4 libobjc_gc.so.4.0.0 libobjc.so.4 libobjc.so.4.0.0 

......事實證明,沒有簡單地稱爲libobjc.so文件 - 他們都有名字,像libobjc.so.* ...所以我想,也許我應該與可能的libobjc.so名稱的符號鏈接:

cd /usr/lib/x86_64-linux-gnu/ 
sudo ln -s libobjc.so.4.0.0 libobjc.so 

...現在當我運行make - 它實際上成功!我會得到一個名爲main一個可執行文件,它運行罰款:

$ ./main 
Hello, my name is Brad Cox! 
Hello, my name is Tom Love! 

好,很高興有一個排序的...