目录
-
makefile简介
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
-
Makefile的书写规
- 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
- 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
-
make的工作方式
在默认的方式下,也就是我们只输入make命令。那么,
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件;
- 如果找到,它会找文件中的第一个目标文件(target);
- 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件;
- 如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件;(这有点像一个堆栈的过程)
- 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件edit了。
-
makefile中使用变量
#表示注释;
var = test //定义变量var,并且将其值强制赋为test;
var += 123 //var的值为test123,即在原有值得基础上追加其他的值;
var ?= test456 //var如果不存在就创建var并且将他的值赋为test456,如果var已经在之前被定义,则使用之前定义时赋的值;
-
makefile的基本结构
-
第一条目标为总目标;
-
依赖可以是文件/目录或其他目标;
-
动作可以时Linux命令或其他的函数,但是动作的那一行第一个字符必须是以TAB键开始;
-
例如:
#第一个总目标 target1: depend1 depend2 depend3 ... #第一个动作 gcc test1.c -o test1 #第二个动作 g++ test1.cpp -o test1_cpp . . . #第二个目标 target2: #第一个动作 gcc test2.c -o test2 #第二个动作 g++ test2.cpp -o test2_cpp . . . clean: rm -rf *.o
-
进入到指定的文件中去执行make的命令:make clean -C Dir(文件名);
-
执行clean的动作:make clean;
-
进入到指定的文件中去执行make clean 的命令:make clean -C Dir(文件名);
-
指定某一确定的makefile文件, make -f XXX_makefile;
-
给makeflie中某一变量赋值:make var = vlaue; //将var的值赋为value;
-
${var} 取出var的值。
-
编程示例:
#第一个总目标
var = test
Target:
gcc test.c -o ${var}
claen:
rm -rf ${var}
-
运行结果
没有运行make命令之前
运行make命令之后