有人可以帮我理解下面的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)
答案 0 :(得分:2)
CC
,CFLAGS
,LIBS
,DEPS
,OBJ
和TARGETs
不是预定义的关键字。它们是变量。您可以将名称更改为任何您认为合适的名称。只需确保您也更改其参考名称:$(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 =