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(, )); [pool drain];
}

这里,__attribute__((fastcall))使得MyASMFunc函数的参数与返回值都能通过寄存器进行传递,这样方便汇编过程的实现。

下面是汇编文件(hello.s):

.text
.align .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

Ubuntu下如何安装并使用Objective-C的更多相关文章

  1. Torch7在Ubuntu下的安装与配置

    Torch7的本系列教程的主要目的是介绍Torch的入门使用.今天首先分享一下Torch7的安装.(在Ubuntu14.04安装torch7) 为什么选择Torch Torch的目标是在建立科学算法的 ...

  2. ubuntu下git安装及使用

    ubuntu下git安装及使用   其实,好几个月前,就已经安装好了,可是一直搁置在那儿,所以密码等一些其它细节都忘的差不多了,所以今天就重新部署了一下,并开始积极使用......... 1,git ...

  3. premake Ubuntu下的安装

    premake是个跨平台的编译工具,先看看在Ubuntu下怎么安装. 首先下载,在/usr目录下: sudo wget -O premake-4.4-beta4-linux.tar.gz http:/ ...

  4. linux,windows,ubuntu下git安装与使用

    ubuntu下git安装与使用:首先应该检查本地是否已经安装了git ,如果没有安装的话,在命令模式下输入 sudo apt-get install git 进行安装 输入git命令查看安装状态及常用 ...

  5. ubuntu下如何安装codeblocks集成开发环境

    codeblocks是一个十分优秀的C/C++开发IDE,虽然后起之秀codelite目前来看大有超越之势哦. 不过在ubuntu下安装codeblocks却比较麻烦,不像其他linux发行版,比如s ...

  6. ubuntu下makeinfo安装,其实真正安装的是texinfo包

    操作系统环境:ubuntu 在终端中执行命令:sudo apt-get install texinfo   今天在打包的时候有个包需要 makeinfo,当时就各种搜结果就没有 makeinfo 这个 ...

  7. Ubuntu下软件安装方式、PATH配置、查找安装位置

    Ubuntu 18.04, 安装方式 目前孤知道的Ubuntu下安装软件方式有3种(命令): 1.make 2.apt/apt-get 3.dpkg 方式1基于软件源码安装,需要经历配置(可选).编译 ...

  8. ubuntu 下python安装及hello world

    //@desn:ubuntu 下python安装及hello world //@desn:码字不宜,转载请注明出处 //@author:张慧源  <turing_zhy@163.com> ...

  9. ubuntu下mysql安装(server、client、dev),开启、停止和重启,及常见错误

    转自:ubuntu下mysql安装(server.client.dev),开启.停止和重启,及常见错误 1. 在ubuntu下安装server和client很简单: (1)安装server apt-g ...

  10. Ubuntu下nagios安装(来源官网)

    Ubuntu下nagios安装(来源官网) https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/toc.html h ...

随机推荐

  1. 高通android7.0刷机工具使用介绍

    刷机工具安装 1. 安装QPST.WIN.2.7 Installer-00448.3 2. 安装python2.7,并配置其环境变量 刷机方法 1.将编译后的刷机文件拷贝到如下目录:SC20_CE_p ...

  2. R语言入门视频笔记--6--R函数之cat、format、switch函数

    一.cat 猫  怎么就变成一个输出函数了呢? cat  一个输出函数,功能和print有相同之处 我们一起比较看看 1.cat(“hellow world”)或cat('hellow world') ...

  3. VirtualBox 5.0.10 中 Fedora 23 在安装了增强工具后无法自动调节虚拟机分辨率的问题(改)

    VirtualBox 5.0.10 中安装 Fedora 23,即使在安装了增强工具后,仍然会发现虚拟机无法根据 VirtualBox 的运行窗口大小自动进行分辨率调节.究其原因,主要是因为 Fedo ...

  4. 测试开发系列之Python开发mock接口(三)

    于进入主题了,前面的准备工作都已经做好了,下面就开始写逻辑的代码了,代码我已经写好了,每行都加了注释,不明白的可以留言.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  5. Java运算基础

    计算机对负数的运算 =  先取绝对值的原码----> 然后取反,----->+1   这是负数的补码表示 例如  -5       5的原码= 0000,0101  取反   1111,1 ...

  6. ubuntu远程桌面设置

    一.服务器端电脑设置: 1.在搜索端搜索desktop sharing,然后设置后退出 二.客户端电脑设置: 1.在搜索端搜索remmina remote desktop client 2.如图设置: ...

  7. Linux下运行Java项目时,出现No X11 DISPLAY variable was set, but this program performed an operation which requires it.的问题解决

    在~/.bashrc环境变量文件最下方加入: export DISPLAY=:0.0 然后,刷新环境变量以使其生效: source -/.bashrc 参考:http://stackoverflow. ...

  8. __new__ 和 __init__

    new 在新式类中负责真正的实例化对象,而__init__只是负责初始化 __new__创建的对象.一般来说 new 创建一个内存对象,也就是实例化的对象的实体,交给__init__进行进一步加工.官 ...

  9. 统计显著性(Statistical significance)

    显著性,又称统计显著性(Statistical significance), 是指零假设为真的情况下拒绝零假设所要承担的风险水平,又叫概率水平,或者显著水平. [1] 显著性的含义是指两个群体的态度之 ...

  10. redis hash 类型的操作命令

    redis 文档: https://redis.readthedocs.io/en/2.4/index.html keys * type key --------------------------- ...