- 查看编译源文件需要的几个不同的阶段:
clang -ccc-print-phases main.m
- 查看oc的c实现:
clang -rewrite-objc main.m
- 查看操作内部命令:
clang -### main.m -o main
- 想看清clang的全部过程,可以先通过-E查看clang在预处理处理这步做了什么:(这个过程的处理包括宏的替换,头文件的导入,以及类似#if的处理)
clang -E main.m
- 预处理完成后就会进行词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等:
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
- 然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树 AST:
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
- 完成这些步骤后就可以开始IR中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入:
clang -S -fobjc-arc -emit-llvm main.m -o main.ll
- 这里 LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass:
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll
- 生成汇编
clang -S -fobjc-arc main.m -o main.s
- 生成目标文件
clang -fmodules -c main.m -o main.o
- 生成可执行文件
clang main.o -o main
- 执行
./main
下面是完整步骤:
1. 编译信息写入辅助文件,创建文件架构 .app 文件
2. 处理文件打包信息
3. 执行 CocoaPod 编译前脚本,checkPods Manifest.lock
4. 编译.m文件,使用 CompileC 和 clang 命令
5. 链接需要的 Framework
6. 编译 xib
7. 拷贝 xib ,资源文件
8. 编译 ImageAssets
9. 处理 info.plist
10. 执行 CocoaPod 脚本
11. 拷贝标准库
12. 创建 .app 文件和签名