本文由自己在网络上收集的相关资料整理而成,并在文章末尾标明了引用出处。
1.编译流程
- 源代码(source code)
- 预处理器(preprocessor)
- 编译器(compiler)
- 目标代码(object code)
- 链接器(linker)
- 可执行程序(executables)
1.1.源代码
源代码一般为高级语言,如C、C++、Python、Java等或汇编语言。
1.2.预处理器
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
在C++中,所有的预处理指令都是以#
开头,只有空格字符可以出现在预处理指令之前。预处理指令不是C++语句,所以不会以;
结尾。
1.3.编译器
编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。
然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。
也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。在编译过程中,
- 前端主要负责词法和语法分析,将源代码转化为抽象语法树;
- 优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;
- 后端则是将已经优化的中间代码转化为针对各自平台的机器代码。
1.4.目标代码
目标代码是指机器语言的目标语言,有时也称作机器代码。
1.5.链接器
链接器是一个将编译器产生的目标文件打包成可执行文件或者库文件或者目标文件的程序。
1.6.可执行程序
可执行程序(executable program,EXE File)是可在操作系统存储空间中浮动定位的二进制可执行程序。它可以加载到内存中,并由操作系统加载并执行。
2.编译器:GCC和Clang
GCC:GNU编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,可以编译很多种语言:C/C++、FORTRAN、JAVA、OBJC、ADA等。
Clang:是一个C、C++、Objective-C和Objective-C++编程语言的轻量级编译器。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。源代码发布于BSD协议下。
3.make和cmake
3.1.make和makefile
当程序只有一个源文件时,可以直接使用gcc或者clang命令编译它。但是当程序包含很多个源文件时,如果用gcc或者clang命令逐个进行编译,这样做不仅工作量巨大而且容易混乱。这个时候,我们就需要借助make工具。
将代码变成可执行文件,叫做编译(compile)。先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。而make就是最常用的构建工具。
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式:通过调用makefile文件中用户指定的命令来进行编译和链接的。而makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
3.2.cmake和CMakeLists.txt
在一些简单的工程中,makefile可以人工编写,但是当工程非常大的时候,手写makefile非常的麻烦,并且如果换了个平台makefile又要重新修改。
这个时候就需要cmake工具,cmake可以更加简单的生成makefile文件供make使用。除此之外,cmake还可以跨平台生成对应平台可以使用的makefile文件。