首頁 > 軟體

Ubuntu下如何安裝並使用Objective-C

2020-06-16 17:48:57

Objective-C是本人用過的最佳類C、物件導向的程式語言。Objective-C與標準C完美相容,而在此基礎上又加上了將物件導向的基礎概念詮釋得最好的SmallTalk元素,使得它既簡潔、又靈活,絕對是做商業化專案的首先程式語言工具。它跟Java相比更接近底層,你可以直接在裡面寫內聯組合或直接與組合檔案一起連線(因為它就是C語言,在C語言基礎上擴充套件了SmallTalk的訊息機制與OO機制)。與C++相比,它顯然又簡潔許多,C++裡的神馬多繼承了、虛擬繼承了,坑之多數不盡。Objective-C非常容易上手,而且語法也不複雜,所以不會導致程式設計師出現過於良莠不齊的現象,整個專案維護起來也十分容易。

因此,不管是在Unix/Linux下還是在OS X/iOS下,使用Objective-C程式設計就是一種享受。下面我將為大家介紹如何在最新版本的 Ubuntu下(14.10)來安裝、編譯Objective-C。


由於,Ubuntu已經有了對Objective-C的編譯器(gobjc)的安裝,因此安裝gobjc的步驟可省,如果你用的Ubuntu的旁系系統沒有安裝可以使用以下命令進行安裝——

sudo apt-get install gobjc

接下來,我們主要就是對gnustep庫的安裝。對OS X或iOS程式設計過的朋友應該對Foundation庫不陌生吧,這個就是在gnustep庫裡的,如果不裝此庫,你連NSObject都用不了,呼呼~先安裝gnustep

sudo apt-get install gnustep

完成之後,我們再安裝gnustep-devel

sudo apt-get install gnustep-devel


這樣整個需要安裝的環境都安裝好了。我們下面就可以寫段程式碼進行編譯了。

在編譯之前,我們進入 /usr/share/GNUstep/Makefiles 目錄,來對編譯環境進行設定,在當前控制台(terminal)執行:

sudo bash /usr/share/GNUstep/Makefiles/GNUstep.sh


這樣,當前控制台的GNUStep的編譯環境就建立好了。然後我們準備做個專案工程,可以建立一個資料夾。然後在裡面先建立一個main.m檔案:

 

#import <Foundation/Foundation.h>

int main(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   

    NSLog(@"Hello, world!");

    unichar c = u'加';

    NSLog(@"The character is: %C", c);

    [pool drain];
}

 

 

之後,我們建立一個make檔案,命名為:GNUmakefile

 

GNUSTEP_MAKEFILES = /usr/share/GNUstep/Makefiles

include $(GNUSTEP_MAKEFILES)/common.make

ADDITIONAL_FLAGS += -std=gnu11

TOOL_NAME = test
test_OBJC_FILES = main.m

include $(GNUSTEP_MAKEFILES)/tool.make

 

由於我們在原始碼中使用了C11標準中才引入的Unicode字首字面量表示式——u'加',表示一個UTF-16字元,因此我們在GNUmakefile中也加入了-std=gnu11這個編譯選項來使得編譯器使用最新的C11標準與GNU規範語法擴充套件。

這裡要注意的是,對於其它Linux版本的系統,GNUStep的預設安裝路徑可能不是在/usr/share/之中,因此需要根據當前GNUStep/Makefiles的路徑對GNUSTEP_MAKEFILES進行設定。而且這個變數必須在include之前定義好。

而下面的TOOL_NAME指定了make之後最終的目標可執行檔名。這裡命名為test。


完了之後,如果我們之前已經執行過GNUstep.sh,那麼可以直接敲make,然後回車。工程即構建完成。如果有“gcc: error trying to exec 'cc1obj': execvp: No such file or directory”之類的錯誤,那麼說明還需要安裝gobjc。


下面提供其它參考連結:

http://www.techotopia.com/index.php/Installing_and_Using_GNUstep_and_Objective-C_on_Linux

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_1.html


這裡注意,對於第一個連結中,如果直接在命令列敲gcc,是無法成功通過連線的,因為gnustep的庫都找不到。所以最好的方式還是通過利用makefile來解決問題,呼呼~


下面在提一下Objective-C與純C以及組合混編的情況。由於GNUStep提供的makefile package僅僅提供了C、C++、Objective-C以及Objective-C++這四種程式語言,而不支援組合語言,因此,如果要在GNUStep工程中使用組合,我這裡的做法是將組合檔案單獨編譯成.o目標檔案,然後再跟其它makefile編譯好的目標檔案進行連線。下面列出了對幾種原始檔型別的支援(其中,斜體的appname就是你最終輸出可執行檔案的名稱):

1、appname_C_FILES: C原始檔,一般是.c

2、appname_OBJC_FILES:Objective-C原始檔,一般是.m

3、appname_CC_FILES:C++原始檔,一般是.cpp或.cc

4、appname_OBJCC_FILES:Objective-C++原始檔,一般是.mm

以上這些變數後面就跟著相應的要編譯的原始檔名,多個原始檔名之間用空格分隔。

其餘一些可用的make變數見如下連結:

http://www.gnu.org/software/gnustep/resources/documentation/Developer/Gui/ProgrammingManual/AppKit_4.html


下面將舉一個例子來說明將一個Objective-C原始檔與組合檔案一起連線成最終的可執行檔案。

Objective-C原始檔(main.m)如下:

 

#import <Foundation/Foundation.h>

extern int __attribute__((fastcall)) MyASMFunc(int a, int b);

int main(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSLog(@"Hello, world!");

    unichar c = u'加';

    NSLog(@"The character is: %C", c);
   
    NSLog(@"The value is: %d", MyASMFunc(10, 20));

    [pool drain];
}

 

這裡,__attribute__((fastcall))使得MyASMFunc函數的引數與返回值都能通過暫存器進行傳遞,這樣方便組合過程的實現。

下面是組合檔案(hello.s):

 

.text
.align 2

.globl MyASMFunc

MyASMFunc:

    // ECX contains the first parameter
    // EDX contains the second parameter
    mov    %ecx, %eax
    add    %edx, %eax
    ret

 

 

組合檔案hello.s寫完之後,可以先用gcc將其組合成目標檔案hello.o,然後我們可以寫GNUmakefile:

 

GNUSTEP_MAKEFILES = /usr/share/GNUstep/Makefiles

include $(GNUSTEP_MAKEFILES)/common.make

ADDITIONAL_FLAGS += -std=gnu11

TOOL_NAME = test
test_OBJC_FILES = main.m

include $(GNUSTEP_MAKEFILES)/tool.make

ALL_LDFLAGS += hello.o

 

最後,ALL_LDFLAGS標誌中新增了hello.o之後,GNUmakefile就會將hello.o與main.o一起連線成最終的可執行檔案test。


如果不用makefile編譯,可以直接使用命令列,比如:

gcc `gnustep-config --objc-flags` -lgnustep-base hello.m -o hello

另外,我們也可以直接在控制台使用:gnustep-config --objc-flags 來檢視編譯Objective-C的預設編譯選項,從而可以做些調整。

如果我們要使用Clang以及Objective-C 2.0的庫可以參考這個連結:http://wiki.gnustep.org/index.php/Building_GNUstep_with_Clang

下載其它庫可以參考這個連結:http://wwwmain.gnustep.org/resources/downloads.php?site=ftp%3A%2F%2Fftp.gnustep.org%2Fpub%2Fgnustep%2F

Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm

Objective-C 和 Core Foundation 物件相互轉換的記憶體管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm

使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm

10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm

Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm

好學的 Objective-C 高清PDF http://www.linuxidc.com/Linux/2014-09/106226.htm


IT145.com E-mail:sddin#qq.com