Linux命令(十三)make_makefile基础

1. 好处

一次编写,终身受益

2. 命名规则

  • makefile

  • Makefile

3. 三要素

  • 目标

  • 依赖

  • 规则命令

4. 第一版makefile

目标:依赖
tab键 规则命令

makefile:

5. 第二版makefile

第一版更改其中一个文件,所有源码都重新编译

5.1 改进

  • 可以考虑编译过程分解,先生成 .o 文件,然后使用 .o 文件变成结果

5.2 定义变量

Makefile隐含规则:默认处理第一个目标

5.3 函数

  • wildcard:可以进行 文件匹配

  • patsubst:内容的替换

# get all .c file
SrcFiles=$(wildcard *.c)


# ObjFiles 定义目标文件
ObjFiles=main.o add.o minu.o mul.o
  

# 目标文件用法         
app.out:$(ObjFiles)    
        gcc -o app.out -I./include *.o
  
main.o:main.c          
        gcc -c main.c -I ./include
  
  
add.o:add.c
        gcc -c add.c -I ./include


minu.o:minu.c
        gcc -c minu.c -I ./include


mul.o:mul.c
        gcc -c mul.c -I ./include

test:
        echo $(SrcFiles)

5.4 makefile变量

  • $@: 代表 目标

  • $^ :  代表全部 依赖

  • $< :  第一个依赖

  • $? :  第一个变化的依赖

# get all .c file
SrcFiles=$(wildcard *.c)

# all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))

# 目标文件用法
app.out:$(ObjFiles1)
        gcc -o app.out -I./include $(ObjFiles1) 

%.o:%.c
        gcc -c $< -I ./include 
test:
echo $(SrcFiles) echo $(ObjFiles1)

5.5 添加清理功能(@在规则前作用)

# get all .c file
SrcFiles=$(wildcard *.c)

# all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))
  
  
# 目标文件用法         
app.out:$(ObjFiles1)   
        gcc -o app.out -I./include $(ObjFiles1) 
  

# 模式匹配规则, $@,$<这样的变量,只能在规则中出现
%.o:%.c
        gcc -c $< -I ./include -o $@ 

test:
        echo $(SrcFiles)
        echo $(ObjFiles1)

# 添加清理功能
clean:
        @rm -f *.o     # 加 @表示指令不输出
        rm -f app.out

5.6 “-”的作用

该条规则报错,仍然继续执行

5.7 防止有歧义, 定义伪目标

.PHONY:clean   # clean是一个伪目标,不是真正要得到的目标

5.8 总结

# get all .c file
SrcFiles=$(wildcard *.c)

# all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))

all:app.out

# 目标文件用法 $@: 目标;$<: 依赖
app.out:$(ObjFiles1)
        gcc -o $@ -I./include $(ObjFiles1) 

app.out1:$(ObjFiles1)
        gcc -o $@ -I./include $(ObjFuiles1)

# 模式匹配规则, $@,$<这样的变量,只能在规则中出现
%.o:%.c
        gcc -c $< -I ./include -o $@ 

test:
        echo $(SrcFiles)
        echo $(ObjFiles1)

# 定义伪目标,防止有歧义
.PHONY:clean

# 添加清理功能
clean:
        -@rm -f *.o     # 加 @表示指令不输出
        rm -f app.out

make  -f   xxx:指定文件 

原文地址:https://www.cnblogs.com/douzujun/p/10568893.html