makefile
对多文件构成的大中型软件项目进行编译、调试的工具
工作机制
有5个源文件
main.c
function1.h
function1.c
function2.h
function2.c
main.c
#include "function1.h"
#include "function2.h"
int main(int argc, char **argv)
{
function1_print("hello");
function2_print("world");
return 0;
}
function1.h
//function1.h
#include<stdio.h>
void function1_print(char *str);
function1.c
//function1.c
#include "function1.h"
void function1_print(char *str)
{
printf("This is function1 print %s\n", str);
}
function2.h
//function2.h
#include<stdio.h>
void function2_print(char *str);
function2.c
//function2.c
#include "function2.h"
void function2_print(char *str)
{
printf("This is function2 print %s\n", str);
}
依赖关系图:
makefile文件:
main: main.o function1.o function2.o
gcc -o main main.o function1.o function2.o
main.o: main.c function1.h function2.h
gcc -c main.c
function1.o: function1.c function1.h
gcc -c function1.c
function2.o: function2.c function2.h
gcc -c function2.c
clean:
rm *.o
make命令会读取makefile文件的内容,比较目标文件和依赖文
件的日期和时间,当依赖文件的日期比目标文件得时间新的时候,
则根据命令重新生成目标文件
简化写法
变量
隐式规则
- C语言程序
.o文件会自动找到对应的.c文件,用cc命令进行编译 - C++程序
.o文件会自动找到对应的.cc文件,用g++进行编译 - 汇编程序
.o文件会自动找到对应的.s文件,并且用as命令进行汇编
简化后:
main: main.o function1.o function2.o
clean:
rm *.o
伪目标
.PHONY:clean
伪目标的语句一定会执行,而不管目标文件是否是最新的。例如:在源代码所在目录下有一个名为clean的文件,那么在make后,它的修改时间一直不会不变化,导致make clean 失效。此时就可以用 .PHONY:clean 来强制cLean。
同时生成多个可执行文件
.PHONY: clean all
all: main hello
main: main.o
gcc $^ -o $@
hello: hello.o
gcc $^ -o $@
%.o: %.c
gcc -c $^ -o $@
clean:
rm -rf *.o