Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 了解Makefile的基本概念_Linux_Shell_Makefile_Gnu Make - Fatal编程技术网

Linux 了解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

我正在尝试升级以下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:
是通过使用标志等执行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-第一句话。我的个人风格是变量的
${}
,函数的
$()