转自:https://blog.csdn.net/zenny_chen/article/details/52507022linux
Objective-C做为Apple的first-class编程语言,在很长一段时间内都获得大量开发者的追捧。其中,Objective-C对C语言的彻底兼容、灵活性以及OOP特性,使得它成为一门十分优秀,且平衡度很高的编程语言。在我全部用过的编程语言中,Objective-C是最最适合用于开发驱动以及应用层程序的编程语言,它比C++轻便地多,但功能上又比C++更强;而在完美兼容C语言的基础上增长了教科书般的OOP特性!其中,消息机制是其灵魂。shell
为了可以在其余平台上较好地使用现代化的Objective-C,我这里推荐使用LLVM Clang编译工具链。另外,如下描述的安装过程是在Ubuntu16.04下进行的,而更早版本的Ubuntu系统也差很少可按照如下操做步骤完成安装和编译使用。编程
咱们装好Ubuntu系统以后,GCC及其相关运行时库就已经默认安装在系统中了。为了保证咱们当前用使用最新的Objective-C编译器以及Foundation库,咱们按照如下步骤先安装gobjc以及GNUStep库:数组
一、sudo apt-get install gobjcxcode
二、sudo apt-get install gnustepruby
三、sudo apt-get install gnustep-develbash
这样咱们把Objective-C的GCC编译器以及GNUStep运行时库都安装好了。编程语言
下面咱们开始下载并安装最新release的LLVM Clang:工具
一、sudo apt-get install llvm测试
二、sudo apt-get install clang
完成这些安装以后,咱们能够把Clang中Apple所给予的Blocks语法相关的运行时库以及Apple开源的Grand Central Dispatch库给装上。
一、sudo apt-get install libblocksruntime-dev
二、sudo apt-get install libdispatch-dev
这样,编译器以及必要的运行时库的安装都结束了。使用Ubuntu系统的一大好处就是安装一些常规工具很是便利,只须要一个sudo apt-get install就能搞定。因此它比较适合非深度Linux用户进行开发使用。
在编译以前,咱们进入 /usr/share/GNUstep/Makefiles 目录,来对编译环境进行设置。咱们直接在控制台执行:
sudo bash /usr/share/GNUstep/Makefiles/GNUstep.sh
便可完成环境配置。
因为Objective-C所依赖的编译选项以及运行时库比较多。因此我这里建议各位作一个makefile或是像我在下面描述的写一个shell文件,把须要的编译命令选项放进去。这样咱们后面要编译源文件时就会方便不少。
咱们首先经过执行如下命令来观察Objective-C编译时所须要的编译选项:
gnustep-config --objc-flags
而后咱们把输出的内容先复制到shell文件中保存好。再执行如下命令查看Objective-C链接时所须要的加载选项:
gnustep-config --objc-libs
而后咱们把加载选项复制黏贴到咱们的shell文件中。
下面咱们能够建立一个main.m源文件进行测试:
完了以后,我下面展现一下我本身整理好的build.sh编译shell文件:
上述build.sh文件中,咱们使用-std=gnu11命令表示将当前的Objective-C以及C语言标准设置为符合GNU11标准语法的,即C11标准加Clang GNU扩展。若是咱们不用GNU语法扩展,咱们就没法使用Blocks语法。-fblocks使得Clang编译器能解析Blocks语法,并生成相应运行时代吗。在上述命令选项中,我把全部有关异常运行时库的命令全都删除了,由于咱们不须要使用Objective-C的异常运行时库。此外,我把-g命令也去掉了,由于咱们也不须要对该程序进行调试。
咱们在运行build.sh的时候会发现,Clang编译器会报一个很乌龙的错误——在GSVersionMacros.h中没法找到<objc/blocks_runtime.h>。咱们在/usr目录下搜索一下objc目录所在位置(在个人系统环境下,目录位置为:/usr/lib/gcc/x86_64-linux-gnu/5/include/),而后咱们在桌面或其余用户目录下建立一个blocks_runtime.h头文件,输入如下内容后用sudo拷贝到该obj目录下。该头文件内容很是简单:
而后咱们再次构建的时候会发生更无语的错误——GSBlocks头文件中对_Blocks_copy以及_Blocks_release的声明与Block.h中的冲突。咱们找到GSBlocks头文件,打开发现,原来里面声明的_Blocks_copy与_Blocks_release的形参类型是void*,而Block.h里声明的则是const void*……无奈之下,咱们修改一下这个源文件,将其参数类型改成const void*就大功告成了。
咱们成功编译构建以后会发现两个与ARC相关的警告,这些都不用理睬。
最后要说明的是,在Clang 3.8编译器中,Objective-C能支持@autoreleasepool、复合字面量、instancetype等高级语法特性;但还不支持property自动综合,甚至不能在类的category以及implementation中声明成员对象。另外也不支持字典、数组的下标索引语法,尽管GNUStep库中已经引入了如下四个方法:
- (void)setObject:(id)object forKeyedSubscript:(id < NSCopying >)aKey;
- (id)objectForKeyedSubscript:(id)key;
- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index;
- (id)objectAtIndexedSubscript:(NSUInteger)index;
上面两个用于NSMutableDictionary,下面两个用于NSMutableArray。可是在语法层面上还不支持下标索引方式,因此在代码示例中用了[array objectAtIndex:0]这种形式,而不是十分简洁的array[0]。
但总的来讲,LLVM Clang 3.8仍是很是不错的,值得一用!