linux中, make 用来管理多模块程序的编译和链接,直至生成可执行文件.
make 程序需要一个编译规则说明文件, 称为makefile, makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系.
简单理解: makefile 就像一个shell脚本, 其中可以执行操作系统的命令, 它带来的好处就是可以实现"自动编译", 一旦写好, make一下, 整个软件功能就完全自动编译, 提高了软件开发的效率.
make 是一个命令工具, 是一个解释makefile中指令的命令工具, 大多数编译器都有这个命令,使用make 可以使重新编译的次数达到最小化. 这不和dockerfile 一样吗? 这样就好理解多了
makefile的编写
makefile规则非常复杂,示例:
[root@bi hello]# vim makefile // 生成makefile文件, 内容下面有.
[root@bi hello]# ls book1 book101 // 确实一下两个文件不存在
ls: cannot access book1: No such file or directory
ls: cannot access book101: No such file or directory
[root@bi hello]# make // make一下, 结果执行了两条命令
gcc -o book1 book1.c
gcc -o book101 book101.c
[root@bi hello]# cat makefile // 查看 makefile的内容
all: book1 book101 // 固定写法, 类似于申明了这个几个文件
book1:book1.c // 说明book1依赖的文件是book1.c
gcc -o book1 book1.c // 编译命令, **这里必须使用一个`tab`, 不能使用空格代替.**
cp book1 bin/. // 将可执行文件放到另一个可以执行目录下.
book101:book101.c
gcc -o book101 book101.c
clean:
rm -rf book1 book101
[root@bi hello]# vim book1.c // 对其中一个文件进行编辑, 完事还需要重新编译
[root@bi hello]# make // 所以再make 一下. 发现只编译了修改过的文件. 其它文件没有编译.
gcc -o book1 book1.c
[root@bi hello]# make book101 // 仅执行这一个标签
[root@bi hello]# make clean // 清除编译目标的动作
想象一下, 把makefile 编辑好了, 不论修改哪个文件, 反正都make一哈, 就能搞定, 这操作比较6
makefile中的变量
[root@bi hello]# vim makefile
[root@bi hello]# cat makefile
CC=gcc // 变量引用
// CC=g++
CFLAGS=-g // 调试时使用-g
// CFLAGS=-02 // 生产时使用-02, 使编译程序达到最优
all: book1 book101
book1:book1.c
$(CC) $(CFLAGS) -o book1 book1.c
book101:book101.c
$(CC) $(CFLAGS) -o book101 book101.c
clean:
rm -rf book1 book101
[root@bi hello]#
这个操作类似C语言中的宏定义.