我偶然发现了这个makefile,它让我感到困惑:
PROJECT_ROOT = ../..
LIBDIR = $(PROJECT_ROOT)/src/lib
INCDIR = $(PROJECT_ROOT)/include
SRCS = proj_start.c function1.c
LIBS = $(LIBDIR)/libtest.a
OBJS = $(SRCS:.c=.o)
PROJECT = project1
FLAGS = -I$(INCDIR)
CC = gcc $(FLAGS)
.c.o:
$(CC) -c $<
$(PROJECT): $(OBJS)
$(CC) $(OBJS) $(LIBS) -o $@
it: $(PROJECT)
clean:
rm -f $(OBJS) $(PROJECT)
depend: $(SRCS)
$(CC) -M $(SRCS) > dependList
sed -e '1,/^# DO NOT DELETE/!d' Makefile > make.tmp
cat dependList >> make.tmp
mv make.tmp Makefile
rm dependList
# DO NOT DELETE THIS LINE以下是让我感到困惑的部分:
LIBDIR = $(PROJECT_ROOT)/src/lib为什么LIBDIR在根目录/src/lib库中?它不应该是根/lib目录(这两个目录都存在于文件层次结构中)吗?
.c.o:
$(CC) -c $<这到底是做什么的?"$<“的计算结果是.c.o?我知道这是一个“后缀规则”,但它们到底是用来做什么的?
depend: $(SRCS)
$(CC) -M $(SRCS) > dependList
sed -e '1,/^# DO NOT DELETE/!d' Makefile > make.tmp
cat dependList >> make.tmp
mv make.tmp Makefile
rm dependList
# DO NOT DELETE THIS LINE为什么我们需要这个部分?看起来所有的依赖关系都已经被处理了...?
发布于 2017-09-18 10:08:38
lib/放在src/之下看起来是一个糟糕的、违反直觉的设计。.c.o:...
是编写隐式规则的the old way。这些天我们会这样写:
%.o: %.c
...foo.c包含行#include bar.h,则此规则会将行foo.o: bar.h附加到makefile。这实际上很重要。https://stackoverflow.com/questions/46269224
复制相似问题