了解Makefile语法

时间:2015-02-13 09:39:11

标签: c makefile

有人可以帮我理解下面的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)

1 个答案:

答案 0 :(得分:2)

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

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

简而言之,它说:任何.o文件都取决于具有相同前缀 .c的{​​{1}}文件($(DEPS)fs.h unqlite.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 =