Clang
Clang
是LLVM
(Low Level Virtual Machine)项目提供的工具链中的编译器的前端部分
LLVM项目是模块化和可重用的编译器和工具链技术的集合,LLVM的一大特色就是,有着独立的、完善的、严格约束的中间代码表示。这种中间代码,就是LLVM的字节码,是LLVM抽象的精髓,前端生成这种中间代码,后端自动进行各类优化分析,让用LLVM开发的编译器,都能用上最先进的后端优化技术。
编译器编译流程如下
来自《编译原理》
编译器分成前端与后端两部分
前端负责处理源代码,后端负责生成目标代码
来自参考链接3
环境
macOS Hign Sierra 10.13.6
Xcode10.1
编译
获取llvm
源代码
1 | % git clone https://git.llvm.org/git/llvm.git/ |
获取Clang
源代码
1 | % cd llvm/tools |
获取compiler-rt
源代码
1 | ## 定位到llvm工程目录下 |
获取libomp
源代码
1 | % cd llvm |
获取libcxx
和libcxxabi
源代码
1 | % cd llvm |
获取测试用例
1 | % cd llvm |
Clang
使用CMake
(一个用于构建,测试和打包软件的开源跨平台工具系列)进行构建
1 | # LLVM 禁止源码内编译(in-tree build is not supported),创建一个与llvm工程同级的build目录 |
替换Clang
1 | ## 查看系统的Clang的位置 |
根据参考链接7
新建Xcode
工程
创建用户自定义配置CC
,并设置DEBUG
时的值为编译完成后Clang
二进制的位置。
⌘ B
编译,查看编译输出的日志,证明已经使用了编译的Clang
错误原因:
1 | Unknown argument: '-index-store-path' |
根据参考链接10,在Build Setting
中搜索index
并将Enable Index-While-Building Functionality
选项设置为NO
⌘ B
错误原因:
1 | fatal error: error in backend: No available targets are compatible with triple "arm64-apple-ios9.0.0" |
分析: 因为该手机架构是arm64
而cmake
编译时指定的是 -DLLVM_TARGETS_TO_BUILD="host;AMDGPU"
,并没有对应的架构
cmake $LLVM_SRC_DIR -DCMAKE_BUILD_TYPE=Release
-DLLVM_TARGETS_TO_BUILD=”ARM;X86;AArch64”
操作
1 | ## 重新编译 |
⌘ B
成功
代码
参考
- llvm.org
- 结构化编译器前端 Clang 介绍
- 编译器架构的王者LLVM
- cmake.org
- wiki-XcodeVersionInfo
- 下载标准库libcxx出现svn: E000104: Error running context: Connection reset by peer的解决方案
- 安装 LLVM + Clang
- 如何让Xcode使用clang的替代版本
- Why can’t I create a directory under /opt without sudo
- compilation-error-when-using-xcode-9-0-with-clang-cannot-specify-o-when-genera