来自我的个人博客Minecode.link
在使用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”
int main(int argc, const char * argv[]) {
NSLog(@"Hello, World!");
return 0;
}
编译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目录 |