使用clang命令行工具编译链接Objective-C应用程序

来源:互联网 发布:苹果官方网站下载软件 编辑:程序博客网 时间:2024/05/09 05:22

Objective-C编程语言是一种面向对象的高级编程语言,可以用它编写基于Mac或者iOS系统的应用程序。

闲言少叙,下面我们创建一个Hello World程序,了解一下最基本的Objective-C程序的写法。打开任何文本编辑工具,例如系统的“文本编辑”工具(应用程序 -> 文本编辑),或者在终端中使用vi命令都可以。这里以文本编辑工具为例,在其编辑区中输入下面的代码:

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){    @autoreleasepool    {        printf("Hello, World!\n");        NSLog(@"Hello, Objective-C!");            }    return 0;}

然后按下S保存,注意需要将其保存为纯文本格式,文件名及其存放路径可以随意,例如test.m。Objective-C程序的源代码文件后缀为.m,头文件后缀是.h。接下来我们可以在Xcode中或者系统终端中对程序进行编译链接,生成可执行文件。这里以命令行方式为例,打开终端(应用程序 -> 实用工具 -> 终端),并通过cd命令进入到test.m文件所在的目录,然后需要使用clang工具对上述程序进行编译链接。在iOS 5之前,我们可以通过gcc工具对源代码进行编译链接,但是由于iOS 5中添加了新的特性,例如ARC以及新的指令,所以需要使用LLVM clang编译器。如果你还使用老的gcc,是无法通过编译的,因为它并不认识源代码中新的指令。

在终端中输入如下命令:

$ clang -fobjc-arc -framework Foundation test.m -o test
这里的$符号是终端命令提示符,并不是输入的内容。-fobjc-arc表示编译需要支持ARC特性,这样才能够理解新添加的指令。-framework Foundation表示引用Foundation框架,这个框架中定义了很多基本的类,例如字符串、数组、字典等等。其作用类似于我们做饭中的各种食材,脱离了食材就没法做饭。后面的test.m就是待编译的源代码文件名。-o test表示输出的可执行文件的文件名是test。

编译链接之后会在当前目录生成test,我们接下来就可以在终端中执行该文件,输入如下命令:

$ ./test
回车之后可以在终端中得到如下输出:

Hello, World!2012-02-24 16:46:37.532 test[75632:707] Hello, Objective-C!
下面解释一下test.m文件中的代码含义。第1行使用#import指令导入Foundation框架的头文件Foundation.h,引用了该头文件之后才能够使用Foundation框架中定义的各种基础类。如果你学过C和C++,你一定知道#include,它也是用于导入头文件。为了防止多次导入同一个头文件,在使用#include指令时还需要配合使用ifdef等条件指令,判断当前是否已经导入了该头文件。但现在好了,#import比#include的优越之处在于,#import保证指定的头文件至多导入一次,不会发生多次导入同一个头文件的问题。

之后定义了一个C函数main,它作为程序的入口点。其函数声明与C语言中的main函数完全一样,argc参数保存了命令行的参数个数(包括命令本身),argv是一个C字符串数组,保存了每个输入的参数的字符串。

接着,在main函数体中,首先使用@autoreleasepool指令定义了一个自动释放域,它用于释放之前申请的内存空间,现在我们可以先不关注它。

然后main函数使用C语言中的printf函数输出了一个C字符串"Hello, World!\n",然后又调用了NSLog函数输出了一个Cocoa字符串@"Hello, Objective-C!"。看上去这两个字符串很类似,但是实际上他们的差别非常大。前者是一个C字符串char*,一个以0结尾的字符数组。后者以@字符开头,它是Cocoa字符串对象,一个NSString类型的对象。C字符串基本上没有提供任何功能,而NSString是Foundation框架中定义的字符串类,它提供了非常多的字符串操作功能,例如获得字符串的长度,查找某个子字符串的位置,判断两个字符串的内容是否相同,获取某个位置的字符等等。所以在使用字符串时我们绝大多数都会使用NSString对象。

最后程序使用return语句返回。

原创粉丝点击