文章目录

一、Makefile1、什么是Makefile2、Makefile编写

二、使用方法三、 总结

一、Makefile

1、什么是Makefile

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

在Linux与Unix环境下使用GNU的make工具可以去构建一个工程,在这个工程中编译只需要一个命令就可以完成编译和运行等操作,不过它需要编写一个叫做Makefile的文件来指定一些编译或运行的规则。

虽然可能看起来编译一个Makefile文件好像比较麻烦,但是编写Makefile不仅可以让我们在之后的使用中通过极少的命令即可完成我们想要的操作,而且也极大的减轻了提供给别人使用时操作起来的复杂程度,我们只需要在shell提示符下输入对应的make命令即可自动化的进行编译等操作,所以说通过GNU make来构建和管理自己的工程是极有必要的。

2、Makefile编写

我们所常用的文件名是Makefile与makefile,我们可以任选其一创建:

vim makefile

创建后我们需要编辑makefile,首先makefile有三大元素:目标、动作、依赖。

目标: 目标就是相当于我们执行的时候的一个功能,我们可以选择,没有选择直接make则用的是主目标,第一个目标就是总目标(如上图的all目标),而当我们make的时候,可以在make后面加上对应目标,如install,则将执行install。

动作:动作就是目标下面的操作指令,也是目标需要去执行的命令,如上图中all目标所执行的是make install命令,他将继续执行install目标,而install目标的动作则是创建库文件夹并把动态库放入对应文件夹。动态库和静态库制作可以参考:动态库与静态库技术

依赖:在目标冒号后写依赖(如all后的clean与shared_lib),写它执行所需要的依赖文件等,如果没有则它不执行,不过makefile一般对于文件比较聪明,它默认会确保文件都在才能执行,所以我们不需要自己再写对文件的依赖,但是我们可以写一些其他目标作为依赖,它表示在执行下面动作的时候需要先执行依赖对应的目标。对于删除目标,我们可以在做编译的总目标中写删除目标的依赖,如all依赖clean,所以它会先去找这个文件删除了后再进行编译的操作。实现了编译前把之前的文件先删除的功能。

注意:makefile换行后必须是Tab不能是空格

当然除了三大元素以外,还有一个重要的就是变量了,合理运用变量可以让我们make时更加方便。

变量:变量是在所有目标之前的,通过"=“来创建变量,并给变量赋值,而在使用的时候我们用”${变量名}"来调用;设置变量可以统一相同的文件名等,然后通过修改变量即可统一修改文件中的变量;可以一边编写动作时一边编写变量,也可以在所有目标、动作和依赖都写完了再来写变量并修改对应的位置会比较逻辑清晰一点。

可见变量赋值也有多个类型:

变量=值:表示直接赋值变量是不可变的,在make时不能改变。变量?=值:表示变量是可变的,可以在make时用“变量名=···”来重新赋值。变量+=值:表示变量是可追加,是把给的新的值追加在原由变量的后面。变量:=值:表示覆盖之前赋值,用于makefile当中,如果一个变量已赋值,用它再进行赋值将会覆盖之前的变量赋值。

二、使用方法

一般我们直接在shell提示符下输入对应的make命令即可,如下图src文件夹中的makefile,我们在shell提示符输入make即可制作动态库并安装到lib文件夹中去:

但是我们并没有进一步编译,因为编译在另一个文件夹(…/src)下的makefile中,所以我们可以在两个文件夹外再建立一个进行make操作的makefile:

在这个makefile中用echo做输出提示,而@echo与echo的直接区别就是@echo不会输出引号外的内容,而echo则会输出。

在主目标中通过make的-C选项来直接执行对应文件夹中的make,而其他目标中也可加上目标名来实现其他目标在对应文件夹中的操作,最终实现只需要make即可完成制作动态库和编译等一系列操作。

三、 总结

本篇介绍了makefile,讲解了makefile的编写与使用方法,在我们的工程项目中合理运用makefile可以让工程操作起来简单方便。

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。