基本概念
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作.
make是一个用于自动化编译和构建过程的工具。它主要用于管理大型软件项目的构建过程,帮助开发者更高效地编译和部署代码,并减少人为错误的发生,这使得软件的编译和部署变得更加自动化和可靠。其中make是一个命令,执行该命令需要当前操作目录下有一个名为makefile或者Makefile的文件,在makefile内部编写指令,随后就可以通过make快速执行一系列的指令了。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
依赖关系和依赖方法
test:test.o
:这个由两个文件名通过一个:
隔开的整体,叫做依赖关系。左侧的test叫做目标文件,右侧的test.o
叫做依赖文件列表
1.依赖关系 :
mytest 依赖于 test.o ,test.o 依赖于 test.s ,test.s 依赖于 test.i ,test.i 依赖于 test.
- 目标文件与其依赖文件之间形成依赖关系。
- 如果依赖文件中任何一个文件发生变化,目标文件就需要重新生成。
- 依赖关系可以形成层次结构,实现文件之间的层次依赖。
2. 目标文件 :
- 目标文件是 make 命令要生成的文件,通常是可执行程序、库文件或中间目标文件。
- 每个目标文件都有一条或多条命令来生成它。
- 目标文件可以有多个依赖文件,这些依赖文件共同决定了目标文件的生成过程。
3.依赖文件列表:
- 依赖文件列表描述了目标文件所依赖的输入文件,如源代码文件、头文件、库文件等。
- 依赖文件列表告诉 make 哪些文件的变化会导致目标文件需要重新生成。
- 依赖文件列表可以包含多个文件,用空格分隔。
gcc -o test test.o
:这个语句叫做依赖方法。
依赖方法 : 如何从 test.o 变成 mytest,如何从 test.s 变成 test.o,如何从 test.i 变成 test.s,如何从 test.c 变成 test.i,这里要注意,依赖方法前面必须用一个Tab
键隔开,不可以是四个空格。
工程是需要被清理的,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
现在有一个问题,为什么执行test:test.c
直接使用make
就可以,但是make clean
才能执行clean
呢?
答案:当
make
后面不接任何内容时,则在makefile
中从上往下查找,找到第一个依赖关系执行,如果将clean放在第一行,则使用make表示执行rm -f test
makefile语法
在makefile
中,指令内部的目标文件可以用$@
代替,依赖文件列表可以用$^
代替:
在makefile
中,是可以定义变量的,只需要用一个等号进行赋值, 此时bin
的值就是test,src
的值就是test.c
,想要使用这个变量,就在对应的地方以$(变量名)
的形式代替即可,这个变量可以放在任何地方,包括指令内部,依赖关系中等等。