Makefile学习笔记
关于程序的编译和链接
一般针对于C、C++而言,第一步是把源文件编译成中间代码文件,Windows下面的中间代码文件的后缀是.obj文件(Object File),Unix中间代码文件的后缀是.o。这个步骤称为编译(compile)。下一步就是链接了,链接就是把所有的中间代码文件合起来生成可执行文件
头文件中放声明,.c和.cpp(源文件)中放定义
一般来说每个源文件都应对应一个中间代码文件
链接时,主要是在链接整个工程文件的函数和全局变量
Makefile的规则
target(目标文件):prerequisites(生成target所需要的的文件或者目标)
[Tab]command(命令之前一定要有tab键开头)
反斜杠/是换行符的意思,为了方便阅读
makefile的文件名可以命名为“Makefile” or “makefile”。首字母大小写都可以,但是后面的必须小写。
Makefile中的变量
例:
main : main.o source_1.o source_2.o/
source_3.o
gcc -o main main.o source_1.o source_2.o/
source_3.o
这里的.o文件和目标文件重复了两次,如果在比较大的项目里面,这种情况1重复了许多次,而当我们哪一次需要修改其中某一个值的时候,我们需要一个一个的去改他们,就很不方便!所有这里就有了变量的用武之地了。如下:
声明一个变量叫variable,下面开始定义:
variable = main.o source_1.o source_2.o/
source_3.o
于是我们就可以很方便的把上面那个例子改为:
main : $(variable)
gcc -o main $(variable)
简单明了~
make自动推导功能
make只要看到[.o]文件之后,他就能自动推导出[.c]文件是[.o]文件的依耐文件。而且gcc -c *.c命令也会自动的被推导出来。这是Makefile的"隐晦规则"
清空目标文件的规则
也许会有如下命令:
clean:
[tab]rm main $(variable) #清空.o文件和可执行文件
此段还可以加以完善:
.PHONY:clean
clean :
[tab]-rm main $(variable)
这里插入一点细节:代码中间的空格和空行不会对程序功能带来影响
回到前面的,.PHONY (phony adj,假的)
意思是代表clean是一个“伪目标”。后面的rm前面加一个减号原因是,当某些文件出现了问题,会跳过这个问题,不理睬继续执行后面的内容。clean不能放在开头,因为如果放在开头的话makefile会认为clean就是默认目标,意思就是程序整个功能变成了“清空目标文件”,第一个目标永远是整个makefile文件最终的目标。