【起航計劃ObjC 001】印第安老斑鳩ObjC的幻想 ---- Ubuntu下安裝並使用Obj-C

如何在最新版本的 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變量見以下連接:

http://www.gnu.org/software/gnustep/resources/documentation/Developer/Gui/ProgrammingManual/AppKit_4.html#Application%20Makefiles


下面將舉一個例子來講明將一個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
相關文章
相關標籤/搜索