有一个Makefile:
ROOT_DIR = $(PWD)
BUILD_DIR = $(ROOT_DIR)/build
CXX = g++
SOURCES = $(wildcard $(ROOT_DIR)/*.cc)
OBJS = $(patsubst %.cc, %.o, $(subst $(ROOT_DIR), $(BUILD_DIR), $(SOURCES)))
$(OBJS) : $(SOURCES)
@echo $< $@
$(CXX) -c -o $@ $<
all: $(OBJS)
$(CXX) $? $<
clean:
rm $(BUILD_DIR)/*o
print : $(ROOT_DIR)/*.cc
@echo "OBJS" $(OBJS)
@echo "SOURCES" $(SOURCES)
@echo "@" $@
@echo "<" $<
@echo "^" $^
@echo "*" $*
以及来源所在的目录:
build main.cc Makefile smb1.cc smb1.h smb1_tr.cc
调用规则时,$(OBJS) : $(SOURCES)它仅适用于列表中的第一个文件。
$(OBJS) : %.cc
如果你写了没有组装先决条件的规则,它也根本不起作用。(例如,尝试将打印规则中的字符替换为。*)%
我究竟做错了什么?
GNU Make 4.1
您可以在此处下载整个目录:https ://disk.yandex.ru/d/r-wId25734YCwA
默认目标是
makefile.all建议将目标设为默认目标。为此,它必须是文件中的第一个,或者您可以使用特殊变量.DEFAULT_GOAL:一般来说,你有一个非常奇怪的makefile。不清楚为什么需要它
ROOT_DIR,我们已经在源目录中。该规则$(OBJS) : $(SOURCES)意味着每个.o-file 依赖于所有.cc-files。这不像你想要那样。但是,在此规则的配方中,您使用了一个$<表示“依赖项列表中的第一个”的变量,即 您.o总是为任何 -file 编译列表中的第一个文件。我会这样写: