一、前言
在之前的章节中我们提到,为了隐藏源码,可以将.c 文件编译后发送。但如果源文件过多,分发和使用都很麻烦。本章将解决该问题。
1.1 补充知识
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中。Makefile 定义了系列的规则来指定哪些文件需要先编译,哪些需要后编译,哪些需要重新编译,甚至进行更复杂的功能操作。Makefile 带来的好处是'自动化编译',一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大地提高了软件开发的效率。
Make 是一个命令工具,是解释 Makefile 中指令的命令工具。Makefile 内部包含依赖关系和依赖方式。
二、理解
我们先创建一个 Makefile 文件(大小写均可)和 myproc.c 文件。
myproc.c
Makefile
然后运行 make,即可编译成功,再进行输出。
注意:项目是要被清理的,所以把 clean 的目标文件设置为伪目标(后续再讲)
上面的 Makefile 文件中:
- 依赖关系:上面的文件 myproc,它依赖 myproc.c。
- 依赖方式:gcc -o myproc myproc.c,就是与之对应的依赖关系。
2.1 引入小故事:加强理解
月底没生活费了,你打电话给家里人(你和家里人的关系就是依赖关系),问他们寻求支助生活费(这就是依赖方式)。
注:依赖关系与依赖方式必须对得上才有用(你不可能打电话问室友的爸爸要生活费)。
2.2 伪目标
项目工程是需要被 clean 的,一般我们这种 clean 的目标文件,我们将它设置为伪目标,用 .PHONY 修饰。伪目标的特性是总是被执行的。
即似乎 myproc 没有伪目标,就不会总是被执行。
[lcb@hcss-ecs-1cde 1]$ make gcc -o myproc myproc.c
[lcb@hcss-ecs-1cde 1]$ make
make: `myproc' is up to date.
[lcb@hcss-ecs-1cde 1]$ make clean
rm -f myproc
[lcb@hcss-ecs-1cde 1]$ make clean
rm -f myproc
[lcb@hcss-ecs-1cde 1]$
上面也确实如此。
注:编译器编译时是自上而下,也就是说如果把 clean 放在最前面,那 make 执行的就是 clean,而不是 myproc。
同样,如果我们为 myproc 加上.PHONY 呢,事实就是也可以无限次执行。
可以如此的原因是:编译器默认老代码不再编译。


