参照:https://www.jianshu.com/p/0b2a7cb9a469
创建工作目录,包含一下文件
- main.c
- person.c
- b.h
- c.h
/*** c.h ***/ //this is c.h
/*** b.h ***/ //this is b.h
/*** main.c ***/ #include<stdio.h> //#include"a1.h" //#include"b.h" int main() { printf("The Version 1.1\n"); return 0; }
如果main.c文件中加上注释的头文件会生成对应的b.h.gch文件,此处存疑
1.创建makefile文件:
/*** makefile ***/ app: main.o person.o other.o gcc -o app main.o person.o other.o main.o:main.c gcc -c main.c a.h person.o:person.c a.h b.h gcc -c person.c other.o:person.c b.h gcc -c person.c -o other.o clean: rm app main.o person.o other.o
2.定义变量,代替目标文件,简化代码:
objects = main.o person.o other.o app : $(objects) gcc -o app $(objects) main.o : main.c gcc -c main.c c.h person.o : person.c c.h b.h gcc -c person.c other.o : person.c b.h gcc -c person.c -o other.o clean : rm app $(objects)
3.使用makefile自动推导机制,简化指令语句
在编译过程中,哪些类型的文件的编译需要哪些指令是固定的,所以makefile文件可以从依赖关系自动推导出后面要执行的语句
简化如下:
objects = main.o person.o app : $(objects) gcc -o app $(objects) main.o : main.c person.o : person.c c.h b.h clean : rm app $(objects)
只有依赖声明下面没有任何语句,makefile才会自动推导,否则执行指定文件。
注意:这里去掉了other.o,是因为other.o依赖person.c手动生成的other.o,这里的makefile只会生成与依赖文件相同名字的.o文件。
4.如果文件不在一个目录下,需要指定目录,只需要在makefile的第一行添加
VPATH = path1 : path2 :path3
makefile文件会自动按照路径顺序,依次查找文件
如图:
person.c文件在 /home/exbot/wangqinghe/makefileTest
b.h文件在/home/exbot/wangqinghe
c.h 文件在当前目录中2019060601 文件夹下
于是makefile 如下:
VPATH = ./2019060601 :/home/exbot/wangqinghe : /home/exbot/wangqinghe/makefileTest CC = gcc objects = main.o person.o app : $(objects) $(CC) -o app $(objects) @echo "input information : compile finished" #@echo "输出信息:编译完成" main.o : main.c person.o : person.c c.h b.h .PHONY : clean clean : rm app $(objects)