Linux 了解Makefile的基本概念
我正在尝试升级以下makefile,但有一个特定元素我无法理解其含义:Linux 了解Makefile的基本概念,linux,shell,makefile,gnu-make,Linux,Shell,Makefile,Gnu Make,我正在尝试升级以下makefile,但有一个特定元素我无法理解其含义: $(OBJDIR)/%.o: %.f Makefile @$(F90) $(FFLAGS) $(POPTIONS) -o $@ $< %.o: %.f Makefile @make $(OBJDIR)/$@ $(OBJDIR)/%.o:%.f生成文件 @$(F90)$(FFLAGS)$(POPTIONS)-o$@$< %.o:%.f生成文件 @make$(OBJDIR
$(OBJDIR)/%.o: %.f Makefile
@$(F90) $(FFLAGS) $(POPTIONS) -o $@ $<
%.o: %.f Makefile
@make $(OBJDIR)/$@
$(OBJDIR)/%.o:%.f生成文件
@$(F90)$(FFLAGS)$(POPTIONS)-o$@$<
%.o:%.f生成文件
@make$(OBJDIR)/$@
我知道$(OBJDIR)/%.o:
是通过使用标志等执行f90编译器获得的。
但是为什么我需要
%.o
规则,以及@make
的含义。我是否缺少对Makefile如何工作的一般理解?@make
表示调用make
,但不要在输出中重复它(@
符号)。正确的方法是@${MAKE}
,因为MAKE
可能不会引用正在执行的MAKE,而${MAKE}
会引用
在makefiles中,规则必须创建它们承诺的目标文件(除非目标文件标记为
.PHONY
)。在这里,%.o
规则承诺构建%.o
,但实际上它构建的是$(OBJDIR)/%.o
。这是一条违反的规则。孤立地说,这个片段没有多大意义。这两条规则重叠,但第一条规则将优先于$(OBJDIR)/
中的任何文件。第二个基本上只是重定向到第一个make
只是第二次运行make
本身,两个配方上的@
前缀至少应该在调试时删除,这样您就可以看到自己在做什么。我希望%.o
规则在任何“正常”makefile处理过程中都不会使用。我相信添加此规则是为了允许用户运行像make foo.o
这样的命令来构建一个.o
文件。如果没有此规则,要构建单个.o
文件,您必须运行make myobjdir/foo.o
(假设变量OBJDIR
设置为值myobjdir
),实际上它是$(make)
,而不是${make}
。请参阅。@jml-第一句话。我的个人风格是变量的${}
,函数的$()
。