1> 编译一个文件
2> 编译多个文件
3> 编译多个目录下的文件
4> inclue makefile
5> 使用规则
1>
target:depend
[tab]cmd
depnd:file
[tab]cmd
举例如下
test:main.o
[tab]gcc -o test main.o
main.o:main.c
[tab]gcc -o main.o -c main.c
2>
2.1 目标文件依赖多个文件
CC = gcc #INC = -I./include/ #LIBVAR = -lpthread #LIBPATH = -L./lib #CFLAGS ?= -O2 -g OBJS := main.o OBJS += add.o OBJS += sub.o SRCS := main.c SRCS += add.c SRCS += sub.c TARGET = test $(TARGET):$(OBJS) $(CC) $(INC) $(CFLAG) -o $@ $^ $(LIBVAR) $(LIBPATH) @echo "build success" $(OBJS):$(SRCS) $(CC) $(INC) $(CFLAG) -c $^ $(LIBVAR) $(LIBPATH) clean: rm -rf $(OBJS) $(TARGET) install: @echo "do nothing"
2.2 生成多个目标文件,我们可使用伪目标
CC = gcc #INC = -I./include/ #LIBVAR = -lpthread #LIBPATH = -L./lib #CFLAGS ?= -O2 -g #SRCS = OBJS := hello.o OBJS += test.o TARGET = test hello all:$(TARGET)
@echo "success to build" test:test.c $(CC) $(INC) $(CFLAGS) -o $@ $^ $(LIBVAR) $(LIBPATH) hello:hello.c $(CC) $(INC) $(CFLAGS) -o $@ $^ $(LIBVAR) $(LIBPATH) clean: rm -rf $(OBJS) $(TARGET) install: @echo "do nothing"
$@ 表示目标文件
$^ 表示所有依赖项
$< 表示第一个文件
简化makefile 如下:
CC = gcc #INC = -I./include/ #LIBVAR = -lpthread #LIBPATH = -L./lib #CFLAGS ?= -O2 -g #SRCS = #wildcard对.c文件进行展开 SRCS = $(wildcard ./*.c) OBJS = $(patsubst %.c, %.o, $(SRCS)) #将SRCS中后缀.c替换成空,即可执行程序的名字与c名字相同 TARGET = $(patsubst %.c, %, $(SRCS)) all:$(TARGET) @echo "success to build" $(TARGET):$(OBJS) gcc $< -o $@ $(OBJS):$(SRCS) gcc -c $< clean: rm -rf $(OBJS) $(TARGET) install: @echo "do nothing"