zoukankan      html  css  js  c++  java
  • Ubuntu下如何安装并使用Objective-C

    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#SEC11


    这里注意,对于第一个链接中,如果直接在命令行敲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#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

    最后,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

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/4080067.html
Copyright © 2011-2022 走看看