关于编译、链接、构建的相关概念
关于编译、链接、构建的相关概念

关于编译、链接、构建的相关概念

编译

编译的英文是Compile,指的是把源代码文件通过编译器转化为目标文件的过程。编译过程的输入文件是C / CPP / H文本文件,输出是OBJ目标文件

编译一般而言是将源代码转换成汇编代码,用以实现这种过程的工具称为编译器(compiler)。但要注意,编译器在同一时刻只能转换一个编译单元,所谓编译单元是指单个的源文件。

编译器一般由相应的编程语言提供。

普通编译是生成当前系统平台下的目标文件,而交叉编译是指生成另一个系统平台下的目标文件。

链接

链接的英文是Link,它指的是把多个OBJ目标文件、LIB库文件链接成一个可执行文件的过程。链接过程的输入是OBJ / LIB等库文件,输出是EXE / DLL等可执行文件。

构建

构建的英文是Build,构建指的是生成整个操作系统的过程。构建涵盖了对源代码的编译对库文件的链接,还有可能包含映像文件打包等其它附加操作。在三个概念中,构建的范围是最大的。

程序通常由多个编译单元组成,倘若逐个的去编译,这多少显得有点琐碎,因此我们需要一个自动化工具用来从源代码生成用户可以使用的目标文件,而这个工具就是构建系统(build system),构建系统所作的就是构建(build),构建的过程中肯定会调用到编译。从这个意义上来说,构建的范围比编译更广。

现在的很多构建系统也包含了包管理器(package manager)的功能,用以解决项目依赖的问题。

编译器(Compiler)与构建系统(Build System)

编译器与构建系统举例

在 Linux 中 编译 C/C++,使用最广的编译器是 GCC ,即 GNU Compiler Collection(GNU 编译器套件),GCC 的原名为 GNU C Compiler(GNU C 语言编译器),因为在后续逐渐支持了 C++、Java 等更多的语言,所以更改了其缩写的含义。有关 GCC 更详细的信息可参考 GCC 小记

除此之外,另一个 C/C++ 编译器 Clang 旨在替代 GCC。

在 Linux 中使用最广的构建系统是 GNU make ,它会读取 Makefile 文件中的配置信息来完成构建,有关 Makefile 文件更详细的信息可参考 Makefile 小记

Java 世界中使用最广的构建系统是 Maven ,而在 Android Studio 中则使用到了后起之秀 Gradle 。

关于make和cmake工具

make 是用来执行Makefile文件的。

make工具可以看成是一个智能的批处理工具,其基本语法是: 目标+依赖+命令,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户)。

这时候就出现了Cmake这个工具,cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。

cmake根据一个叫CMakeLists.txt文件(学名:组态档)去生成对应的文件(如Makefile)。

如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形。

参考文章

1.编译、链接和构建:_jjunjoe的专栏-CSDN博客_编译和构建的区别
2.编译与构建 | Howie’s Notes (howiezhao.github.io)
3.GCC 小记 | Howie’s Notes (howiezhao.github.io)
4.Makefile 小记 | Howie’s Notes (howiezhao.github.io)
5.make makefile cmake qmake都是什么,有什么区别? – 知乎 (zhihu.com)

0 0 投票数
打个分吧!
guest
1 评论
最新
最旧 最多点赞
内联反馈
查看所有评论
laml

来了来了

1
0
希望看到您的想法,请您发表评论x
()
x