参照: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文件,此处存疑

make文件基础用法_#include

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文件。

make文件基础用法_头文件_02

4.如果文件不在一个目录下,需要指定目录,只需要在makefile的第一行添加

VPATH = path1 : path2 :path3

makefile文件会自动按照路径顺序,依次查找文件

make文件基础用法_#include_03

如图:

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)