2

请考虑以下 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 中列出的所有对象都存在,它确实使用我的全匹配目标。因此,似乎匹配取决于先决条件的存在。

显然:

当一个规则是终端时,它不适用,除非它的先决条件确实存在。

(根据 制作手册)。但我的规则不是最终的;它没有用双冒号标记!

那么为什么这似乎仍然适用?

我可能还会问是否有人有更好的解决方案来区分对象目标和可执行目标,就像我在文件中尝试做的那样。

4

1 回答 1

0

我很惊讶 Make 能够在 UTILITIES 尚不存在时构建 TS_CG,因为我不希望它知道 TS_CG 需要它们。

无论如何,当 Make 试图为 TS_CG 寻找规则时,它所找到的只是隐含规则(没有特定于 TS_CG 的规则)。特别是,它具有%: %.cpp $(UTILITIES)您提供的 , 和%: %.cpp, 是内置的。如果 $(UTILITIES) 都存在,那么它将使用第一个规则,否则它将向下移动列表,寻找其先决条件确实存在的规则,并找到第二个。只有当它找不到任何存在先决条件的规则时,它才会求助于寻找规则来构建先决条件。

于 2010-06-21T01:51:26.043 回答