文章目的:使用make命令编译一个目录下有多个C文件的简单工程
Makefile基本规则
要更新target,必须首先更新它的所有prerequisites。recipe是执行的命令。
target ... : prerequisites ...
recipe
注意recipe,前面是tab键。是空格会报错
函数
- wildcard:通配符
- patsubst:替换命令
目录内容如下:
├── Makefile
├── hello.c
├── hello.h
├── main.c
├── world.c
└── world.h
Makefile输入如下内容
#wildcard:为当前目录下的所有.c字符,赋值给变量src
#“%”可以匹配目标和条件的任何部分,比如hello.c可以写成%.c
src=$(wildcard *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))
#约定俗成的名字all
all:
@echo $(src)
@echo $(obj)
Makefile中#是注释
$ make
hello.c world.c main.c
hello.o world.o main.o
Automatic Variables
- $^:规则中的所有条件,以空格分隔
- $@:规则中的目标
- $<:规则中的第一个条件
#wildcard:为目录下的所有.c字符,赋值给变量src
src=$(wildcard *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))
all:$(obj)
@echo $^
@echo $@
@echo $<
$ make
hello.o world.o main.o
all
hello.o
实现
#wildcard:为目录下的所有.c字符,赋值给变量src
src=$(wildcard *.c)
#patsubst:在src中查找含.c的字符串,替换为.o字符串,赋值给变量obj
obj=$(patsubst %.c, %.o, $(src))
#定义使用的gcc编译
CC=gcc
#通常定义成编译选项
CFLAGS=-Wall -g
#约定俗成的名字:all, install, clean, distclean
all:main
main:$(obj)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) -c $<
#.PHONY:生成一个伪目标。把clean当成一个特殊的名字使用。无条件的运行recipe
.PHONY:clean
clean:
$(RM) *.o
#加@:表示不显示命令本身。
@echo "clean complete"
执行结果
$ make
gcc -Wall -g -c hello.c
gcc -Wall -g -c world.c
gcc -Wall -g -c main.c
gcc hello.o world.o main.o -o main
参考
- GUN make
- Linux C编程一站式学习