了解 Makefile 语法

Understanding Makefile syntax

有人可以帮助我理解下面的 makefile 吗? 我对我不确定的部分发表评论。我使用过 make 文件,但没有广泛使用,我认为我没有遵循好的做法,所以欢迎任何建议。

CC=gcc #is CC, libs, deps, obj, etc  predefined keywords or could I use something else
CFLAGS=-I. -g -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse #same with CFlags 
LIBS = -luuid -lfuse -pthread
DEPS = fs.h unqlite.h
OBJ = unqlite.o fs.o
TARGET1 = test
TARGET2 = test2
TARGET3 = test3
TARGET4 = test4
TARGET5 = main

all: $(TARGET1) $(TARGET2) $(TARGET3) $(TARGET4) $(TARGET5)

%.o: %.c $(DEPS) #not sure on this line
    $(CC) -c -o $@ $< $(CFLAGS) #same here 

$(TARGET1): $(TARGET1).o $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS) #what are $@ and $^ 

$(TARGET2): $(TARGET2).o $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

$(TARGET3): $(TARGET3).o $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

$(TARGET4): $(TARGET4).c
    gcc -o test test.c

$(TARGET5): $(TARGET5).c
    gcc -o uuid uuid.c -luuid

.PHONY: clean

clean:
    rm -f *.o *~ core $(TARGET1) $(TARGET2) $(TARGET3) $(TARGET4) $(TARGET5)

CCCFLAGSLIBSDEPSOBJTARGETs 不是预定义关键字。它们是变量。您可以将名称更改为任何您认为合适的名称。只要确保您还更改了它们的参考名称:$(CC) $(CFLAGS)

%.o: %.c $(DEPS) - 这是一个模式规则:https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html

简而言之,它表示:任何 .o 文件都依赖于具有相同前缀 $(DEPS).c 文件(它们是 fs.hunqlite.h)

$@$<$^ 是规则的自动变量:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic-Variables

如果按以下方式工作:当从源文件制作 test.o 目标文件时,规则

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

解释为:

test.o: test.c fs.h unqlite.h
    gcc -c -o test.o test.c -I. -g -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse

然后,当生成 test 二进制时,规则

$(TARGET1): $(TARGET1).o $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

变成:

test: test.o unqlite.o fs.o
    gcc -o test  test.o unqlite.o fs.o -I. -g -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -luuid -lfuse -pthread

因此,我们可以看到,CFLAGS 引用在规则中是无用的,因为它定义了编译标志,而规则实际上执行链接。所以正确的应该是:

$(TARGET1): $(TARGET1).o $(OBJ)
    gcc -o $@ $^ $(LDFLAGS) $(LIBS)

其中 LDFLAGS 将被定义为一些有用的值,或者可以留空:

LDFLAGS =