clang是编译器前端,用来做预处理,词法分析,语法分析,它可以把结果转换为抽象语法树AST,然后交给LLVM编译器后端,最终生成可执行程序。

代码的编译过程可以分为预处理,词法分析,语法分析,语义分析,目标代码,链接,生成可执行程序,本文在MacOS平台结合clang命令完成一段C++代码的编译。

新建一个文件main.cpp,写入C++代码。

#include <iostream>#define STR "Hello world"int main(int argc, const char * argv[]) {std::string a = STR;std::cout << a << std::endl;return 0;
}

我们先使用clang命令查看这个段代码的编译过程,由于代码是C++,需要使用clang++

clang++ -ccc-print-phases main.cpp

终端输出了信息

               +- 0: input, "main.cpp", c+++- 1: preprocessor, {0}, c++-cpp-output+- 2: compiler, {1}, ir+- 3: backend, {2}, assembler+- 4: assembler, {3}, object
+- 5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image

input指的是输入源码文件,preprocessor是预处理,compiler是编译器前端,compiler做词法分析,语法分析,语义分析。随后backend生成汇编,生成目标文件。linker是链接,生成image。最后bind-arch处理架构信息,生成架构相关的image文件。

1.查看preprocessor预处理过程

clang++ -E main.cpp -o main.i

生成的main.i文件很长,滑动到底部可以看到源码部分

int main(int argc, const char * argv[]) {std::string a = "Hello world";std::cout << a << std::endl;return 0;
}

可以看到预处理阶段,宏定义被展开,代码部分还未处理。

2.查看词法分析

clang++ -fmodules -E -Xclang -dump-tokens main.cpp

生成的词法分析结果很长,这里仅截取一小段

identifier 'std'    [StartOfLine] [LeadingSpace]   Loc=<main.cpp:14:5>
coloncolon '::'       Loc=<main.cpp:14:8>
identifier 'cout'     Loc=<main.cpp:14:10>
lessless '<<'    [LeadingSpace] Loc=<main.cpp:14:15>
identifier 'a'     [LeadingSpace] Loc=<main.cpp:14:18>
lessless '<<'    [LeadingSpace] Loc=<main.cpp:14:20>
identifier 'std'   [LeadingSpace] Loc=<main.cpp:14:23>
coloncolon '::'       Loc=<main.cpp:14:26>
identifier 'endl'     Loc=<main.cpp:14:28>
semi ';'      Loc=<main.cpp:14:32>
return 'return'    [StartOfLine] [LeadingSpace]   Loc=<main.cpp:15:5>
numeric_constant '0'   [LeadingSpace] Loc=<main.cpp:15:12>
semi ';'      Loc=<main.cpp:15:13>
r_brace '}'    [StartOfLine]  Loc=<main.cpp:16:1>
eof ''        Loc=<main.cpp:16:2>

词法分析就是对源码进行解析,生成一个个token,从结果看std,::,cout,a等符号都被识别出来。左侧是token的类型,比如identifier标识符,semi分号,eof是文件末尾。右侧记录了每个符号在源码的中行号列号。

3.语法分析

clang++ -fmodules -fsyntax-only -Xclang -ast-dump main.cpp

4.语义分析

clang++ -S -emit-llvm main.cpp

当前目录会生成main.ll语法分析文件

5.汇编文件

clang++ -S main.cpp

当前目录会生成main.s的汇编文件

6.生成目标文件

clang++ -c main.s

当前目录会生成main.o目标文件,这个文件是二进制形式的。

7.生成可执行文件

 clang++  main.cpp -o main

当前目录生成main文件,在命令行中执行./main 即可运行程序,输出Hello world

MacOS使用clang相关推荐

  1. macos 安装clang和cmake

    macos 安装clang和cmake clang cmake clang 在终端输入gcc就会安装 cmake https://cmake.org/download/ 根据版本选择下载,由于默认使用 ...

  2. Macos 安装Clang和LLVM过程记录

    Macos 安装Clang和LLVM过程记录 文章目录 Macos 安装Clang和LLVM过程记录 安装Cmake 安装homebrew 安装doc 安装svn 下载LLVM 下载Clang 下载C ...

  3. Xcode MacOS与clang c++版本关系

    关于clang https://en.wikipedia.org/wiki/Clang 7 September 2017 Clang 5.0.0 released 19 January 2018 Cl ...

  4. mac下RTSP服务器搭建(ZLMediaKit)

    mac下RTSP服务器搭建(ZLMediaKit) 目录 获取代码 编译器 cmake 依赖库 构建和编译项目 运行 测试 注:参考wiki(包含其他系统安装方式):https://github.co ...

  5. 弱监督学习框架 Detectron2/DRN-WSOD-pytorch 在服务器/windows上配置安装及使用

    最近做弱监督学习研究,进行相关分析.发现Detectron2是一个不错的框架,其中也有model zoo相当多种类的预训练模型可以拿来直接用.但是安装配置使用中碰到了许多坑.跟各位小伙伴们分享. 推荐 ...

  6. Tauri vs. Electron:比较、操作方法和迁移指南

    九年前,Electron 团队通过引入一个允许我们使用基本的 HTML.CSS 和 JavaScript 知识快速构建一个框架,彻底改变了我们创建桌面应用程序的方式.除非受到有效批评,否则 Elect ...

  7. linux搭建rtsp服务端,手把手搭建RTSP流媒体服务器

    0.引言 本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit.通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP.RTMP等流. ZLMediaKit码云 ...

  8. QT设置调试器Debugger

    QT设置调试器Debugger 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 QT设置调试器Debugger 1.调试器支 ...

  9. Detectorn2篇之介绍和安装

    Detectron2篇之介绍与安装 Detectron2是Facebook人工智能研究的下一代软件系统,它实现了最先进的目标探测算法.它是对之前Detectron版本的重写,源自maskrcn -be ...

最新文章

  1. shell排序-c语言
  2. Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
  3. 开展project 正常的生活之路
  4. 四十四、Mysql的命令和PyMysql
  5. java二维数组水平翻转,C 语言 利用二维数组实现对输入的数组进行翻转
  6. 西瓜书——极大似然估计和朴素贝叶斯
  7. OC NSNumber NSValue
  8. 线性表的链式存储——单链表的遍历与优化
  9. 【渗透测试】IIS6.0的安装、使用与相关漏洞
  10. 项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
  11. 终极网络电视王 v3.25 是什么
  12. 面向大规模数据的云端管理,百度沧海存储产品解析
  13. 架构师工程攻城略地需要具备的八大核心能力
  14. vue3自定义开发酒店房态时间组件
  15. 西游记中13大高手排名
  16. 领导竟然在上班时间偷看这种网站...
  17. Kafka Manager 云平台用户使用手册 didi / Logi-KafkaManager
  18. 银联网关支付demo
  19. linux的地址随机化ASLR,[翻译]Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)...
  20. 粒子特效遮罩 UGUI SpriteMask

热门文章

  1. 负载转矩观测器的设计与仿真实现(二)
  2. iOS离线缓存架构设计方案
  3. Github使用教程图文详解
  4. 二、机器学习之回归模型分析
  5. Django Rest Framework - 实例PartyDemo 之 增删改查
  6. 基于matlab的线性调频信号(lfm)脉冲压缩仿真
  7. Tg值的测试方法以及影响因素揭秘
  8. Markdown笔记:痛苦与挣扎
  9. 细聊网络层协议之ARP、RARP协议
  10. 花痴流口水颜文字_你好世界流口水计划