请考虑以下 Makefile:
CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o
UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o
# All objects
%.o: %.cpp %.hpp
$(CC) $(CFLAGS) $<
# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
$(CC) $(EFLAGS) % $< $(UTILITIES)
# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
#$(CC) $(EFLAGS) $@ $@.cpp $(UTILITIES)
match-anything 规则(对于可执行文件)应该使我能够在终端中键入以下内容:
make TS_CG
并让编译名为 TS_CG 的可执行文件。但是,make
不使用我的全匹配目标。相反,它使用其默认编译规则。
另一方面,如果 UTILITIES 中列出的所有对象都存在,它确实使用我的全匹配目标。因此,似乎匹配取决于先决条件的存在。
显然:
当一个规则是终端时,它不适用,除非它的先决条件确实存在。
(根据 制作手册)。但我的规则不是最终的;它没有用双冒号标记!
那么为什么这似乎仍然适用?
我可能还会问是否有人有更好的解决方案来区分对象目标和可执行目标,就像我在文件中尝试做的那样。