Makefile

1、Linux编译过程

  微观的C/C++编译执行的过程。

  C语言     .C      ------->       .exe  

gcc   hello.c  -o  hello.out

       过程:

    -E   预处理 : 把.h  .c 展开形成一个文件。宏定义直接替换  头文件库文件添加   生成.i文件

gcc  -E  hello.c  -o  hello.i    //预处理

    -S   汇编:      把.i 文件生成一个汇编代码文件    .S

gcc  -S  hello.i  -o  hello.s    //汇编生成汇编文件

    -c    编译:      把.S文件生成一个.o 文件    或者.obj文件

gcc  -c  hello.s  -o  hello.o    //编译生成编译文件

    -o    链接:      把.o文件链接   成  .exe(windows环境)  或者.elf文件

gcc  hello.o  -o  hello.out  //链接生成可执行文件

2、脚本语言:Makefile

  Linux C/C++ 必须要使用的一个编译脚本。

  Makefile  大型项目开发。 makefile新的脚本语言

  第一层:

#注释
#第一层:显示规则
#目标文件:依赖文件
#【TABLE】指令
#
#第一个目标文件是最终文件,逆序

hello:hello.o
    gcc -E hello.o -o hello

hello.o:hello.s
    gcc -E hello.s -o hello.o

hello.s:hello.i
    gcc -E hello.i -o hello.s

hello.i:hello.c
    gcc -E hello.c -o hello.i

以上 ,执行make 命令,显示规则会自动执行。

#注释
#第一层:显示规则
#目标文件:依赖文件
#【TABLE】指令
#
#第一个目标文件是最终文件,逆序

hello:hello.o
    gcc -E hello.o -o hello

hello.o:hello.s
    gcc -E hello.s -o hello.o

hello.s:hello.i
    gcc -E hello.i -o hello.s

hello.i:hello.c    
    gcc -E hello.c -o hello.i

#rm -rf hello.o hello.s hello.i hello
#伪目标
#.PHONY: #虚伪的 假的
#    clear:  #伪目标的目标

.PHONY:
    clearall:
        rm -rf hello.o hello.s hello.i hello  # 执行make clearall 自动执行标签代码

    clear:
        rm -rf hello  # 执行make clear 自动执行标签代码

以上,执行make clear 或者make clearall  命令会根据伪标签指定的标签选择执行。

# circle.c circle.h cube.c cube.h main.c main.h
# 得到可以执行的test文件  省去预编译 汇编等
test:circle.o cube.o main.o
    gcc circle.o cube.o main.o -o test
circle.o:circle.c
    gcc circle.c -o circle.o
cube.o:cube.c
    gcc cube.c -o cube.o
main.o:main.c
    gcc main.c -o main.o

.PHONY:
    clearall:
        rm -rf circle.o cube.o main.o test
    clear:
        rm -rf circle.o cube.o main.o

以上,执行make 自动编译显示规则,执行make clear 执行隐式规则,make clearall隐式规则清楚全部

  第二层:

 变量 

=   (替换)

+=追加   

:=(常量)

TAR =test
OBJ =circle.o cube.o main.o
CC := gcc

$(TAR) : $(OBJ)
    $(CC)  $(OBJ)  -o $(TAR)
circle.o:circle.c
    $(CC) circle.c -o circle.o
cube.o:cube.c
    $(CC) cube.c -o cube.o
main.o:main.c
    $(CC) main.c -o main.o

  第三层:

 隐式规则   %.c  %.o  任意的.c或者.o   

*.c  *.o  所有的.c   .o

%.o : %.c
    $(CC) %.c -o %.o

  第四层:

 通配符

$^所有的依赖文件   

$@所有的目标文件

$<所有的依赖文件的第一个文件     

会自动匹配同名的.o .c .s文件

TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
RMRF := rm -rf

$(TAR) : $(OBJ)
    $(CC)   $^   -o    $@
%.o : %.c
    $(CC)   $^   -o    $@
.PHONY:
  clearall:
    $(RMRF) $(OBJ) $(TAR)
  clear:
    $(RMRF) $(OBJ)

  第五层:

 函数

原文地址:https://www.cnblogs.com/ucas123/p/14176794.html