💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、为什么需要make?
- 二、make/Makefile介绍
- 1、Makefile是干什么的?
- 2.make又是什么?
- 三、具体使用展示
- 四、深层理解
- 五、项目清理
一、为什么需要make?
我们在linux中编译一个C代码时,会经过预处理,编译,汇编,链接
才会生成一个可执行文件a.out
。
我们知道,自己在写一个代码时需要进行多次调试,也就意味着可能会重复很多遍 预处理,编译,汇编,链接 这一流程。那么有没有一个像vs编译器中直接点击运行就可直接编译运行的东东呢。
——make
二、make/Makefile介绍
1、Makefile是干什么的?
Makefile
是一个文件。它是一个工程文件的编译规则,它记录了原始码如何编译的详细信息、描述了整个工程的编译链接等规则。Makefile
带来的好处就是自动化编译。一旦写好,只需要一个make
命令,整个工程完全自动编译,极大的提高了软件开发的效率。
它的语法如下:
target(目标文件):文件1 文件2(依赖文件列表) //依赖关系
<Tab>gcc -o 欲建立的执行文件 目标文件1 目标文件2 ///依赖方法
command
...
...
简单来看:
- 目标文件:依赖文件
- <Tap> 依赖方法
📆makefile规则:
- 目标文件与依赖文件列表文件之间要使用冒号隔开目标文件
:
依赖文件列表 - target可以是一个目标文件、执行文件,甚至可以是一个标签【伪目标】
- 依赖方法前面必须加
Tab
空格键 - 依赖方法以gcc为例,也可以是其他的shell指令【command】
2.make又是什么?
make
:是一个解释makefile中指令的命令工具
三、具体使用展示
例如,我这里创建好了一个test.c文件,首先,去我们的makefile文件中使用 vim进行写入。
下图是Makefile文件,此时我们只需要在Makefile写上这两行即可
保存退出后,直接make一下,可以发现,它自动在当前源文件的所在路径下搜寻Makefile,并解释里面命令。之后若是我们需要去编译任何文件,只需要在Makefile里面做一个添加即可,怎么样,是不是很方便
四、深层理解
就拿上面例子来说,其实test1.c并不是目标文件的直接依赖文件,其实也是经过预处理编译汇编链接等一步步形成目标文件的。
所以,Makefile中的内容也可写成如下:
可以发现,从上到下,从可执行文件一步步溯源到test.c源文件。这就是一个完整的依赖关系。但是这样写也太多了,还好我们平常使用写两行(如三、中示例)。这里写了一遍完整的,其实是为了探求make是如何自动推导Makefile文件中的依赖关系的。
执行:
make扫描Makefile文件时会默认执行第一组依赖关系和依赖方法
- make指令进入Makefile中就从第一组开始查找。在第一组依赖关系和方法时发现【mytest】的依赖文件【test1.o】不存在,就将这一个(依赖方法)入栈;
- 继续查找第二个,此时又发现【test1.o】的依赖文件【test1.s】又不存在,又入栈;
- 继续查找第三个,又发现【test1.s】的依赖文件【test1.i】又不存在,又入栈;
- 继续查找第四个,此时【test1.i】的依赖文件【test1.c】存在。就依次出栈。
不管Makefile文件中的顺序怎么变,make的执行逻辑不会改变。
最后获取的便是那个我们最初想要的目标文件,即使Makefile中的编译顺序发生了变化,make也会去做一个自动推导的工作
五、项目清理
平时我们在进行各种操作之后目录中都会出现很多文件,此时当我们不想要这些文件的时候,就得去一一删除,显得尤为麻烦,如果编译可以使用Makefile来自动化构建,那清理项目中的文件可不可以呢,我们来看看
- 此时我们在Makefile中增加一个clean功能
执行make clean:
可以发现,中间文件确实不存在了。
更多make和makefile的详解看下篇!!!