Gnu make 如何在GNUmakefile中循环对象

Gnu make 如何在GNUmakefile中循环对象,gnu-make,Gnu Make,我对GNUmakefile是新手,我想做的事情非常简单。如下所示,OBJS包含MYDir下的所有*.c文件。接下来我要做的是在OBJS中存储的每个.c文件上运行一个名为MyProgram的程序。但我不知道如何将每个.c从OBJS传递到“runThis” 谢谢 DIR := MyDir OBJS := $(wildcard $(DIR:=/*.c)) .PHONY: all all : $(OBJS) runThis runThis: MyProgram some.c

我对GNUmakefile是新手,我想做的事情非常简单。如下所示,OBJS包含MYDir下的所有*.c文件。接下来我要做的是在OBJS中存储的每个.c文件上运行一个名为MyProgram的程序。但我不知道如何将每个.c从OBJS传递到“runThis”

谢谢

DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))

.PHONY: all

all : $(OBJS) runThis

runThis:
        MyProgram   some.c

最简单的是,您可以直接在规则中传递
$(OBJS)
(我冒昧地将其重命名为CFILES):

DIR := MyDir
CFILES := $(wildcard $(DIR:=/*.c))

.PHONY: all

all:
        for f in $(CFILES); do MyProg $$f; done
这是假设Bourne样式的shell(如
bash
dash
ash
,等等)并且您的文件名不包含空格

您还可以让GNU进行循环的“艰苦工作”:

DIR := MyDir
CFILES := $(wildcard $(DIR:=/*.c))

.PHONY: all

define gen-rule
  all: process-$1

  process-$1:
        MyProg $1

endef

$(eval $(foreach c,$(CFILES),$(call gen-rule,$(c))))
对于
$(c)
中的每个文件
$(c)
,我们创建一个规则
过程-$(c)
,并使
所有
规则依赖于该规则。

还有另一个途径:

DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))

DUMMY_TGTS := $(addsuffix ., $(OBJS))

.PHONY: all $(DUMMY_TGTS)

all : $(DUMMY_TGTS)

$(DUMMY_TGTS) : %. : %
    MyProgram $<
DIR:=MyDir
OBJS:=$(通配符$(DIR:=/*.c))
DUMMY_TGTS:=$(addsuffix.,$(OBJS))
.PHONY:all$(虚拟的)
全部:$(虚拟\u TGTS)
$(虚拟变量):%。:%
我的计划$<
与stackoverflow make answers一样,您需要将缩进从空格切换到制表符


它使用一个单独调用每个
.c
文件上的
MyProgram
DUMMY\u TGTS
是用
设置的。PHONY
确保即使存在同名文件,它们仍会触发规则。

您的问题中没有足够的信息来回答它。Make用于将一种类型的文件转换为另一种类型的文件。这里,您说您正在每个源文件上运行
MyProgram
,但没有说
MyProgram
的输出是什么。在您指定之前,您无法编写makefile(我们也无法帮助您)。Make允许您编写关于如何基于依赖项创建内容的规则。您的
all
规则取决于
$(OBJS)
OBJ
可能应命名为
CFILES
或类似名称,以免引起混淆)。没有规则使
$(OBJS)
。由于使用基于目录中现有文件的
$(通配符)
创建了
$(OBJS)
,因此它没有任何功能(如果您的文件不存在,甚至不会给您一个错误)。