1 makefile的意义
- makefile用于定义源文件间的依赖关系
- makefile说明如何编译各个源文件并生成可执行文件
2 依赖的定义
makefile中元素的含义
- targets
- 通常是需要生成的目标文件名
- make所需执行的命令名称
- prerequisites
- 当前目标所依赖的其它目标或文件
- command
- 完成目标所需要执行的命令
规则中的注意事项
- targets可以包含多个目标
- 使用空格对多个目标进行分隔
- prerequisites可以包含多个依赖
- 使用空格对多个依赖进行分隔
- [ Tab ]键:’\t’
- 每一个命令行必须以[ Tab ]字符开始
- [ Tab ]字符告诉make此行是一个命令行
- 续行符:\
- 可以将内容分开写到下一行,提高可读性
一个makefile的依赖示例
依赖规则
- 当目标对应的文件不存在,执行对应命令
- 当依赖在时间上比目标更新,执行对应命令
- 当依赖关系连续发生,对比依赖链上的每一个目标
小技巧
- makefile中可以在命令前加上@符,作用为命令无回显
编程实验:makefile的规则依赖
all : test
@echo "make all"
test :
@echo "make test"
3 第一个make的编译案例
小技巧
- 工程开发中可以将最终可执行文件名和all同时作为makefile中第一条规则
- all主要用来强制执行相关命令
hello.out all : main.o func.o
gcc -o hello.out main.o func.o
编程实验:初探make编译
func.c:
#include "stdio.h"
void foo()
{
printf("void foo() : hello makefile\n");
}
main.c:
extern void foo();
int main()
{
foo();
return 0;
}
makefile:
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
编程实验:make用于编译java程序
HelloJava.java:
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello Java!");
}
}
makefile:
HelloJava.class all: HelloJava.java
@javac HelloJava.java
@java HelloJava
4 小结
- makefile用于定义源文件间的依赖关系
- makefile说明如何编译各个源文件并生成可执行程序
- makefile的目标之间存在连续依赖关系
- 依赖存在并且命令执行成功目标完成的充要条件
修改记录
时间 | 动作 |
---|---|
2017.7.3 | 首次上传 |
参考资料
唐老师 — 狄泰软件学院 — 十二月提升计划