如何在最新版本的 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

【起航计划ObjC 001】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用Obj-C的更多相关文章

  1. 【起航计划ObjC 003】印第安老斑鸠ObjC的幻想 ---- ObjC经典问题

    1.Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议. 2.#import和#include的区别是什么?#import<> 跟 #im ...

  2. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机

    本文介绍如何在Ubuntu下安装Mac OS X Mavericks系统.具体如下: 1)安装前准备工作 下载Mac OS X Mavericks系统,地址:http://pan.baidu.com/ ...

  3. Ubuntu下安装Wine&WineQQ+Phpstorm+wps+svn+vim(计划任的使用)+flashplayer+curl扩展

    一.安装Wine 1.添加PPA sudo add-apt-repository ppa:ubuntu-wine/ppa 2.更新列表 sudo apt-get update 3.安装Wine sud ...

  4. 【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01

    本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitap ...

  5. Ubuntu下的计划任务 -- cron的基本知识

    下面不完全: 参考:http://blog.csdn.net/cuker919/article/details/6336457 cron是一个Linux下的后台进程,用来定期的执行一些任务.因为我用的 ...

  6. 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App->Service->Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程

    本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallb ...

  7. 【起航计划 036】2015 起航计划 Android APIDemo的魔鬼步伐 35 App->Service->Messenger Service Messenger实现进程间通信

    前面LocalService 主要是提供同一Application中组件来使用,如果希望支持不同应用或进程使用Service.可以通过Messenger.使用Messgener可以用来支持进程间通信而 ...

  8. 【起航计划 035】2015 起航计划 Android APIDemo的魔鬼步伐 34 App->Service->Local Service Controller

    Local Service Controller 是将LocalService当作“Started”Service来使用,相对于”Bound” Service 来说,这种模式用法要简单得多,Local ...

  9. 【起航计划 034】2015 起航计划 Android APIDemo的魔鬼步伐 33 App->Service->Local Service Binding 绑定服务 ServiceConnection Binder

    本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为LocalServiceActivities ...

随机推荐

  1. ELK (Elasticsearch , Logstash, Kibana [+FileBeat])

    ELK 简述: ELK 是: Elasticsearch , Logstash, Kibana 简称, 它们都是开源软件. Elasticsearch[搜索]是个开源分布式基于Lucene的搜索引擎, ...

  2. centos下dnsmasq安装与配置

    说明1.dnsmasq是一款小巧且方便地用于配置DNS服务器和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能. 2.dnsmasq可以解决小范围的dns查询问题,如 ...

  3. em 与 rem 区别.

    em 与自身  字体大小有关. rem 与 body 的字体大小有关..

  4. java的Spring学习2- junit和mock

    <!-- 引用Mock --> <dependency> <groupId>org.mockito</groupId> <artifactId&g ...

  5. 用淘宝镜像安装electron的方法

    在网友那里看到的,命令如下,亲测安装electron 1.7.9 成功,关键是几秒钟就搞定了.今天是 11 Dec 2017. ELECTRON_MIRROR=http://npm.taobao.or ...

  6. HTTP security headers 安全头例子

    这是从以下网站测试得到的结果,参考测试项目可以知道哪些安全头应该如何设置. https://observatory.mozilla.org/analyze.html?host=appcanary.co ...

  7. 一种简单快速的模板解析方法,活用with javascript版

    //一种简单快速的模板解析方法,活用with var parseTpl = function( str, data ) { var tmpl = 'var __p=[];' + 'with(obj|| ...

  8. 01背包----简单DP

    描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要ne ...

  9. HDU 2879 数论

    HeHe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  10. vim(三)golang代码跳转配

    在golang的代码里跳来跳去.... godef 安装 跳转是通过godef实现,godef的安装目录一般是$GOBIN,只要让godef命令在$PATH下即可 godef 命令安装: go get ...