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

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

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

[plain]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. int main (int argc, const char * argv[])  
  4. {  
  5.     @autoreleasepool  
  6.     {  
  7.         printf("Hello, World!\n");  
  8.         NSLog(@"Hello, Objective-C!");          
  9.     }  
  10.     return 0;  
  11. }  

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

在终端中输入如下命令:

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

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

[plain]  view plain copy
  1. $ ./test  
回车之后可以在终端中得到如下输出:

[plain]  view plain copy
  1. Hello, World!  
  2. 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语句返回。

文章出处:http://blog.csdn.net/pucker/article/details/7291240


最后贴上一些常见问题

  •  1 关注
  •  3 收藏,6.7k 浏览
0

在mac下使用如下gcc命令编译:

gcc  relearn.c  support.c -o -g relearn
clang: error: no such file or directory: 'relearn'

gcc是在安装xcode时自动安装的
clang是编译器前端,为什么调用gcc是使用clang,还是mac下使用gcc命令被连接到clang完成,如果是这样,clang只是前端,从中间代码到机器指令,又是那个程序完成的呢?

2 个回答

5
采纳
Windoze 9.1k  2014年05月21日 回答

因为从Mac OS X 10.9/Xcode 5开始,系统里没有GCC了,你以为是GCC的那些gccg++之类的命令只是clang的别名。

4
a0z 1.9k  2014年05月21日 回答

作为@Windoze 答案的补充,你可以先在shell中用gcc -v查看gcc的版本信息,OS X最新版的应该是这样:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix

而直接查看clang -v,就是这一个样子的:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix

同时我的Mac上还通过Homebrew安装了GCC-4.8,用gcc-4.8 -v查看,可见:

Using built-in specs.
COLLECT_GCC=gcc-4.8
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/4.8.2/libexec/gcc/x86_64-apple-darwin13.1.0/4.8.2/lto-wrapper
Target: x86_64-apple-darwin13.1.0
Configured with: ../configure --build=x86_64-apple-darwin13.1.0 --prefix=/usr/local/Cellar/gcc/4.8.2 --enable-languages=c,c++,objc,obj-c++ --program-suffix=-4.8 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-cloog=/usr/local/opt/cloog --with-isl=/usr/local/opt/isl --with-system-zlib --enable-version-specific-runtime-libs --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.8.2 (GCC)

所以就是:OS X里本身没有gcc,而XCode 5的Command Line Tools中提供的是苹果做的clang。最终就是这个样子啦。


本文出处: http://blog.csdn.net/pucker/article/details/7291240


其他 :Xcode从命令行编译链接  http://zhiwei.li/text/2011/08/05/xcode从命令行编译工程/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值