Objective-C开发中Clang的使用

在使用Objective-C开发过程中,尤其在了解某些功能的底层实现时,常用到Clang编译器的命令。在此对常用命令做个简单总结。

Clang的简介

Clang是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端,其后端为底层虚拟机(LLVM)。是一个GCC的替代品,也是Xcode的首选编译器。

通过Clang,我们可以做什么?

  • 编译OC代码,这也是它的本职工作。
  • 可以将OC代码转化至C++或汇编代码,从而窥探OC某些特性的底层实现。
  • 在终端快速编译,占用较少内存,同时具有诊断功能。

编译OC代码

除了使用Xcode编译工程,我们也可以通过Clang来手动编译。

在Xcode中开发项目时,我们知道,Project->Targets->Build Phases->Compile Sources中对应的文件标记就是指定该文件为ARC/Non-ARC(MRC)。其中ARC对应-fobjc-arc,MRC对应-fno-objc-arc。而刚才说到Clang实际就是LLVM的前端,所以我们在clang中使用同样指令指定编译方式。如下指令:

ARC下编译指令
clang -fobjc-arc -framework Foundation main.m -o main
MRC下编译指令
clang -fno-objc-arc -framework Foundation main.m -o main

  • -framwork [框架名] 对应所使用的框架
  • -o [文件名] 为输出的可执行文件名

我们在.m文件中输出 “Hello,World”

1
2
3
4
int main(int argc, const char * argv[]) {
NSLog(@"Hello, World!");
return 0;
}

编译OC代码,生成的可执行文件以及终端执行结果如下:
Clang编译OC代码

转换为C++代码

OC底层实现为C,所以要研究其属性、消息机制、Runtime等特性,就要用到Clang的代码转化。

将OC的.m文件转化为C++源代码
clang -rewrite-objc main.m

生成的cpp即为OC的底层实现,接下来就是研究其底层实现的工作了。

转换为汇编代码

高级语言最终是要转化为汇编然后转化为01串的,Clang为我们提供了转化为汇编的功能。

将OC的.m文件转化为汇编源代码
clang -S main.m

生成的.s即为对应的汇编实现。

其他指令

由于其他指令并不常见,不再赘述,列举部分以供查阅。

指令 说明
-E 预编译代码(即处理宏定义)
-C 仅编译但不链接(生成.o链接文件)
-S 仅编译不汇编(生成.s汇编代码文件)
-o 文件名 链接,输出可执行文件
-g 在可执行程序中包含标准调试信息
-I 路径 在头文件的搜索路径列表中添加dir目录
-L 路径 在库文件的搜索路径列表中添加dir目录

相关资料

  1. Clang documentation