1 使用场景
在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。
gcc -o main main.c
使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复度劳动太多,特别是在大型项目中,源文件数量较多时,需要将可执行程序依赖的源文件一一列举,徒增工作量。在这种情况下,使用makefile可以帮助我们一键完成编译,从而省下很多时间。
2 使用方式
2.1 makefile文件的编写
首先我们需要进行makefile文件编写。在源文件所在目录下创建一个名为makefile或Makefile的文件,并按如下示例编写文件。
main:main.c func.c
gcc -o main main.c func.c
该makefile文件的第一行为一个依赖关系,冒号左侧为该依赖关系所生成的文件,而冒号右侧为其所依赖的文件。若该makefile文件所在路径下存在main.c和func.c文件,则可以在当前目录下使用make命令,使makefile执行该依赖关系后的指令,将他们编译生成main文件。
make
makefile文件中也可以存在多个依赖关系,例如下列逐步编译。在这个文件中,若直接使用make指令,则makefile会以第一行依赖关系为基准,先生成main所依赖的main.o。同理,由于main.o依赖于main.s,那么会先生成main.s,以此类推,逐步生成。
main:main.o
gcc -o main main.s
main.o:main.s
gcc -c main.s -o main.o
main.s:main.i
gcc -S main.i -o main.s
main.i:main.c
gcc -E main.c -o main.i
这样做的好处是可以控制makefile自动编译的编译进度。假设我们只需要生成其中的main.o文件,我们可以通过以下指令获得。那么makefile只会编译到main.o,而不会继续向后生成main。
make main.o
事实上,直接使用 make 指令就相当于直接执行 makefile 文件中的第一个依赖关系。
2.2 伪目标
使用 makefile 时,为了避免重复编译,makefile 会判断所执行的依赖关系是否更新。若源文件未更新,则不会执行依赖关系,从而提高编译效率。
若想强制执行,则需要将该依赖关系设为伪目标,如下。
.PHONY:main
main:main.c
gcc -o main main.c
伪目标多用于删除已生成的文件,如下,其中 clean: 同样为依赖关系。
main:main.c
gcc -o main main.c
.PHONY:clean
clean:
rm -f main
这样,我们就可以使用 makefile 实现快速编译和删除了。
make clean