学习Makefile

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"
原文地址:https://www.cnblogs.com/jyfyonghu/p/10526209.html