了解 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)
CC
、CFLAGS
、LIBS
、DEPS
、OBJ
和 TARGETs
不是预定义关键字。它们是变量。您可以将名称更改为任何您认为合适的名称。只要确保您还更改了它们的参考名称:$(CC)
$(CFLAGS)
等
%.o: %.c $(DEPS)
-
这是一个模式规则:https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html
简而言之,它表示:任何 .o
文件都依赖于具有相同前缀 和 $(DEPS)
的 .c
文件(它们是 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 =
有人可以帮助我理解下面的 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)
CC
、CFLAGS
、LIBS
、DEPS
、OBJ
和 TARGETs
不是预定义关键字。它们是变量。您可以将名称更改为任何您认为合适的名称。只要确保您还更改了它们的参考名称:$(CC)
$(CFLAGS)
等
%.o: %.c $(DEPS)
-
这是一个模式规则:https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html
简而言之,它表示:任何 .o
文件都依赖于具有相同前缀 和 $(DEPS)
的 .c
文件(它们是 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 =