假如有一个上百个文件的代码构成的项目,如果只是对其中一个或少数几个文件进行了修改,若用gcc编译工具就不得不把整个项目里的文件重新编译一遍。
编译过程分为编译、汇编链接等阶段。其中,编译阶段仅检查语法错误以及函数与变量的声明是否正确,在链接阶段则主要完成函数链接和全局变量的链接。因此,没有改动的源代码根本不需要重新编译,而只需将它们重新链接进去就可以了。
make工程管理器是一个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量。同时,它通过读入makefile文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。
目标文件:依赖文件
(TAB)产生目标文件的命令
注意:
gcc前面的空格是用TAB生成,而不是按空格键。
2. 使用makefile编译文件的操作步骤
分成文件 2-5-main.c,2-5-fun1.c,2-5-fun2.c,my.h
2-5:2-5-main.o 2-5-fun1.o 2-5-fun2.c
gcc 2-5-main.o 2-5-fun1.o 2-5-fun2.o -o 2-5
2-5-main.o:2-5-main.c my.h
gcc 2-5-main.c -c
2-5-fun1.o:2-5-fun1.c
gcc 2-5-fun1.c -c
2-5-fun2.o:2-5-fun2.c
gcc 2-5-fun2.c -c
在编辑makefile文件时可以自定义一些变量来代表一串文字,例如
CC=gcc
objects=2-5-main.o 2-5-fun1.o 2-5-fun2.o
2-5:$(objects)
$(CC) $(objects) -o 2-6
..........
在这个makefile文件中,目标文件(target)包含可执行文件2-5和中间目标文件(*.o)。依赖文件(prerequisites)包含冒号后面大的那些.c文件和.h文件。每一个.o文件都有一组依赖文件,而这些.o文件又是可执行文件2-5的依赖文件。依赖关系的实质是说明目标文件由哪些文件生成。在定义好依赖关系后,后续的代码定义如何生成目标文件的操作系统命令,其一定要以一个Tab键作为开头。
make -f makefile2-5
在默认方式下,只输入make命令,其会做如下工作:
1) make会在当前目录下查找名字为makefile 的文件或“makefile文件夹”的文件。如果找到,它会找文件中的第一个目标文件(target)。如果该目标文件不存在,或是该目标文件所依赖的.o文件的修改时间比它新,就会执行后面所定义的命令来生成第一个目标文件。
2) 如果第一个目标文件所依赖的.o文件也存在,make会在当前文件中找目标为.o文件的依赖性,如果找到,则会根据规则生成.o文件。
3) c文件和h文件如果存在,make会生成.o文件,然后再用.o文件生成make的最终结果,也就是可执行文件,即第一个目标文件。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖性,直到最终编译出第一个目标文件。在寻找的过程中,如果出现错误,则make会直接退出,并报错。对所定义的命令的错误,或是编译不成功,make就不会处理。如果在make找到了依赖关系之后,冒号后面的文件不存在,make仍不工作。
./2-5
编译过程分为编译、汇编链接等阶段。其中,编译阶段仅检查语法错误以及函数与变量的声明是否正确,在链接阶段则主要完成函数链接和全局变量的链接。因此,没有改动的源代码根本不需要重新编译,而只需将它们重新链接进去就可以了。
make工程管理器是一个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量。同时,它通过读入makefile文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。
- 编写makefile文件
- 需要由makefile工具创建的目标体(target),通常是目标文件或可执行文件。
- 要创建的目标所依赖的文件。
- 创建每个目标体时需要运行的命令。
目标文件:依赖文件
(TAB)产生目标文件的命令
注意:
gcc前面的空格是用TAB生成,而不是按空格键。
2. 使用makefile编译文件的操作步骤
- 编写代码,分成多个文件
分成文件 2-5-main.c,2-5-fun1.c,2-5-fun2.c,my.h
- 编辑makefile文件
2-5:2-5-main.o 2-5-fun1.o 2-5-fun2.c
gcc 2-5-main.o 2-5-fun1.o 2-5-fun2.o -o 2-5
2-5-main.o:2-5-main.c my.h
gcc 2-5-main.c -c
2-5-fun1.o:2-5-fun1.c
gcc 2-5-fun1.c -c
2-5-fun2.o:2-5-fun2.c
gcc 2-5-fun2.c -c
在编辑makefile文件时可以自定义一些变量来代表一串文字,例如
CC=gcc
objects=2-5-main.o 2-5-fun1.o 2-5-fun2.o
2-5:$(objects)
$(CC) $(objects) -o 2-6
..........
在这个makefile文件中,目标文件(target)包含可执行文件2-5和中间目标文件(*.o)。依赖文件(prerequisites)包含冒号后面大的那些.c文件和.h文件。每一个.o文件都有一组依赖文件,而这些.o文件又是可执行文件2-5的依赖文件。依赖关系的实质是说明目标文件由哪些文件生成。在定义好依赖关系后,后续的代码定义如何生成目标文件的操作系统命令,其一定要以一个Tab键作为开头。
- 用make命令编译
make -f makefile2-5
在默认方式下,只输入make命令,其会做如下工作:
1) make会在当前目录下查找名字为makefile 的文件或“makefile文件夹”的文件。如果找到,它会找文件中的第一个目标文件(target)。如果该目标文件不存在,或是该目标文件所依赖的.o文件的修改时间比它新,就会执行后面所定义的命令来生成第一个目标文件。
2) 如果第一个目标文件所依赖的.o文件也存在,make会在当前文件中找目标为.o文件的依赖性,如果找到,则会根据规则生成.o文件。
3) c文件和h文件如果存在,make会生成.o文件,然后再用.o文件生成make的最终结果,也就是可执行文件,即第一个目标文件。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖性,直到最终编译出第一个目标文件。在寻找的过程中,如果出现错误,则make会直接退出,并报错。对所定义的命令的错误,或是编译不成功,make就不会处理。如果在make找到了依赖关系之后,冒号后面的文件不存在,make仍不工作。
- 运行程序
./2-5