如何在最新版本的 Ubuntu下(14.10)來安裝、編譯Objective-C?php
Ubuntu已經有了對Objective-C的編譯器(gobjc)的安裝,所以安裝gobjc的步驟可省,若是你用的Ubuntu的旁系系統沒有安裝可使用如下命令進行安裝:html
sudo apt-get install gobjc
接下來,咱們主要就是對gnustep庫的安裝。對OS X或iOS編程過的朋友應該對Foundation庫不陌生吧,這個就是在gnustep庫裏的,若是不裝此庫,你連NSObject都用不了,呼呼~先安裝gnustep:編程
sudo apt-get install gnustep
完成以後,咱們再安裝gnustep-devel:bash
sudo apt-get install gnustep-devel
這樣整個須要安裝的環境都安裝好了。咱們下面就能夠寫段代碼進行編譯了。app
在編譯以前,咱們進入 /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(無後綴):ui
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規範語法擴展。spa
這裏要注意的是,對於其它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#SEC11
這裏注意,對於第一個連接中,若是直接在命令行敲gcc,是沒法成功經過鏈接的,由於gnustep的庫都找不到。因此最好的方式仍是經過利用makefile來解決問題,呼呼~
下面在提一下Objective-C與純C以及彙編混編的狀況。因爲GNUStep提供的makefile package僅僅提供了C、C++、Objective-C以及Objective-C++這四種編程語言,而不支持彙編語言,所以,若是要在 GNUStep工程中使用匯編,我這裏的作法是將彙編文件單獨編譯成.o目標文件,而後再跟其它makefile編譯好的目標文件進行鏈接。下面列出了對 幾種源文件類型的支持(其中,斜體的appname就是你最終輸出可執行文件的名稱):
一、appname_C_FILES
: C源文件,通常是.c
二、appname_OBJC_FILES
:Objective-C源文件,通常是.m
三、appname_CC_FILES
:C++源文件,通常是.cpp或.cc
四、appname_OBJCC_FILES:Objective-C++源文件,通常是.mm
以上這些變量後面就跟着相應的要編譯的源文件名,多個源文件名之間用空格分隔。
其他一些可用的make變量見以下連接:
下面將舉一個例子來講明將一個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