Makefile gnu制造:匹配任何东西:依赖于先决条件的存在 请考虑下面的Mag文件: 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) CC=g++ CFLAGS=-c-O-Wall EFLAGS=-O-Wall-lm-O 实用工具=错误.o流\u manip.o材料\u操作.o高斯林.o 实用程序+=抽象矩阵.o dvector.o dmatrix.o congGrad.o #所有对象 %.o:%.cpp%.hpp $(CC)$(CFLAGS)$< #可执行文件(没有扩展名) %:%.cpp$(公用事业) $(CC)$(EFLAGS)%$

Makefile gnu制造:匹配任何东西:依赖于先决条件的存在 请考虑下面的Mag文件: 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) CC=g++ CFLAGS=-c-O-Wall EFLAGS=-O-Wall-lm-O 实用工具=错误.o流\u manip.o材料\u操作.o高斯林.o 实用程序+=抽象矩阵.o dvector.o dmatrix.o congGrad.o #所有对象 %.o:%.cpp%.hpp $(CC)$(CFLAGS)$< #可执行文件(没有扩展名) %:%.cpp$(公用事业) $(CC)$(EFLAGS)%$,makefile,wildcard,gnu-make,Makefile,Wildcard,Gnu Make,“匹配任何内容”规则(适用于可执行文件)应允许我在终端中键入以下内容: make t_CG 并编译名为TS_CG的可执行文件。但是,make不使用我的全部匹配目标。相反,它使用默认的编译规则 另一方面,如果实用程序中列出的所有对象都存在,那么它将使用“我的全部匹配”目标。因此,匹配似乎取决于先决条件的存在 显然: 当规则是终端时,除非其先决条件实际存在,否则它不适用 (根据 ). 但我的规则不是终结;它没有用双冒号标记 那么,为什么这似乎仍然适用 我可能还会问,是否有人有更好的解决方案来区分对象

“匹配任何内容”规则(适用于可执行文件)应允许我在终端中键入以下内容:

make t_CG

并编译名为TS_CG的可执行文件。但是,
make
不使用我的全部匹配目标。相反,它使用默认的编译规则

另一方面,如果实用程序中列出的所有对象都存在,那么它将使用“我的全部匹配”目标。因此,匹配似乎取决于先决条件的存在

显然:

当规则是终端时,除非其先决条件实际存在,否则它不适用

(根据 ). 但我的规则不是终结;它没有用双冒号标记

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


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

我很惊讶Make能够在实用程序不存在的情况下构建TS\U CG,因为我不希望它知道TS\U CG需要它们


无论如何,当Make试图为TS_CG查找规则时,它所找到的都是隐式规则(没有特定于TS_CG的规则)。特别是,它有您提供的
%:%.cpp$(实用工具)
,以及内置的
%:%.cpp
。如果$(UTILITIES)all存在,则它将使用第一条规则,否则它将在列表中下移,查找前提条件确实存在的规则,然后查找第二条规则。只有当它找不到任何先决条件存在的规则时,它才会求助于寻找规则来构建先决条件。

我很惊讶Make能够在实用程序不存在的情况下构建TS\U CG,因为我不希望它知道TS\U CG需要它们


无论如何,当Make试图为TS_CG查找规则时,它所找到的都是隐式规则(没有特定于TS_CG的规则)。特别是,它有您提供的
%:%.cpp$(实用工具)
,以及内置的
%:%.cpp
。如果$(UTILITIES)all存在,则它将使用第一条规则,否则它将在列表中下移,查找前提条件确实存在的规则,然后查找第二条规则。只有当它找不到任何先决条件存在的规则时,才会求助于寻找规则来构建先决条件。

感谢您的回复Beta,我认为这是正确的答案。这似乎与我在文章中引用的make手册相反,但我想这是因为内置规则没有被我的规则覆盖(我想是的)。谢谢你的回复Beta,我认为这是正确的答案。这似乎与我在文章中引用的make手册相反,但我想这是因为内置规则没有被我的规则覆盖(我认为它会被覆盖)。