Makefile项目管理工具
它是一门脚本语言
作用:
1.便于编译管理代码
2.节省编译时间
3.一次编写终身受益(复用性特别强)
我们来看一下一个程序执行的过程,.o文件是核心二进制文件,(Linux下是.o ,windows下是.obj)在编译过程中暂存,如果说节省编译时间,主要节省生成核心二进制时间
庞大项目有无数文件生成核心二进制文件,有大量的时间开销,如果说因为你改动了一个很小的改动却导致文件全都编译一遍,那么这个结果对我们来说是非常不好的,所以要用Makefile来节约。
Makefile编译简单,文件的名字可以是Makefile,也可以是makefile,但不能是makefila,或mikefile,
过程:
1.创建Makefile文件
2.文件中写入脚本
3.执行make命令解析执行脚本,(在当前文件下寻找makefile文件)
目标 依赖 和命令是makefile的三要素
注意:命令的前面一定要有一个tab 键而不是4个空格,一定要以一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。
像下面的例子: all本身并不存在 所以只要执行make或者make all指令的时候都会产生gcc a.c -o app这个生成核心二进制文件的命令 那么makefile不就是没意义了吗?这就涉及到makefile的执行原理了
这个时候 makefile是怎么执行的呢?
当有多条makefile语句时执行原理又是怎么样的呢?
Makefile执行原理:
kefile是总结来说:他是
自顶向下分析依赖
自底向上执行命令
make会比较目标文件和依赖文件的修改日期,如果依赖文件的日期要比目标文件的日期要新,或者目标不存在的话,那么,make就会执行后续定义的命令。
现在我们如果有一个main.c文件 里面分别调用了加减乘除函数 我们如果想提高这个代码的复用性的话,可以分别再写4个 add.c sub.c mul.c div.c
由此我们可以写出
-I后面放的是头文件目录
Include中有个test.h
放的是函数的声明
那么现在我们完成了基本的编写
再加上一些小小的功能
clean output install disclean是无依赖功能目标
它就只有
目标名:
(这里是Tab键 不是四个空格)执行的命令(某些功能)
使用方法是:make + 目标名
clean 是编译后消除中间文件临时文件 (给人留下中间文件是很大的安全隐患)
install 是将编译后的程序移动到指定路径/usr/bin 这样你的app可执行程序就可以在任意位置执行了
disclean则是将程序从指定删除并删除配置文件
output 就是用echo输出的一段话了 不要在意这些细节
但是无依赖功能目标有一个缺点 与其同名文件会导致功能目标失效
目标与之对比会不执行命令,就是如果你有一个clean文件 那么make clean则不会生效
所以就有了伪目标!
.PHONY 伪目标 写在makefile最前面 避免目标同名文件影响功能目标的执行,就可以定义伪目标忽略同名文件
最后结果就如下图,
这只是一些最简单的应用,可能一些小的demo还可以用上,但是实际应用中没人会这么写,因为他的复用性还不够强,下次再说吧。