我想了解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_PATH
和LIBRARY_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
- 什麼,我需要做的,讓這個程序鏈接?
我期待這個問題的原因是多方面的一個closevote,但絕對不是「無關」?有人可以解釋這是如何脫離主題,我可以在哪裏發佈它(如果在Stack Exchange上有這樣的網站?)謝謝! – sdaau