Makefile GNU make-如何将隐式模式设置为先决条件

Makefile GNU make-如何将隐式模式设置为先决条件,makefile,gnu-make,Makefile,Gnu Make,我有一个隐含的规则: %.so: %.so.5 qnx_ln $< $@ 但是我得到了输出 ***没有规则使“makegen”需要目标“%.so”。停下来 %先决条件模式只能用于静态和隐式模式规则,其中它们与目标的相应%部分相匹配;在常规规则中使用时,%是文字字符 除非某些源文件名与文件名之间存在某种对应关系,否则您需要按字面意思指定依赖项。因此,您可以利用文件名,假设您已经在执行这两种操作中的任何一种来链接。因此,首先文件。%前提模式只能用于静态和隐式模式规则,其中它们与目标的

我有一个隐含的规则:

%.so: %.so.5
    qnx_ln $< $@
但是我得到了输出

***没有规则使“makegen”需要目标“%.so”。停下来


%
先决条件模式只能用于静态和隐式模式规则,其中它们与目标的相应
%
部分相匹配;在常规规则中使用时,
%
是文字字符


除非某些源文件名与
文件名之间存在某种对应关系,否则您需要按字面意思指定依赖项。因此,您可以利用
文件名,假设您已经在执行这两种操作中的任何一种来链接
。因此,首先
文件。

%
前提模式只能用于静态和隐式模式规则,其中它们与目标的相应
%
部分相匹配;在常规规则中使用时,
%
是文字字符


除非某些源文件名与
.so
文件名之间存在某种对应关系,否则您需要按照字面上的意思指定依赖关系。因此,您可以利用这些文件名来链接
.so
文件。如前所述,不,您不能这样做,因为这不是前提模式的工作方式。也许你考虑了以下问题并拒绝了,但我怀疑你可能会发现以下问题非常适合:

%.so.target: %.so.5
        echo $< >> $(BUILD)/so.targets

SO_TARGETS=$(basename $(shell cat $(BUILD)/so.targets))

makegen: $(TEAM_ROOT)HMI_FORGF/src/src.pro module_dirs $(SO_TARGETS)
%.so.target:%.so.5
echo$<>>$(构建)/so.targets
SO_TARGETS=$(basename$(shell cat$(BUILD)/SO.TARGETS))
makegen:$(团队根目录)HMI\u FORGF/src/src.pro模块\u dirs$(SO\u目标)

正如前面指出的,不,您不能这样做,因为这不是必备模式的工作方式。也许你考虑了以下问题并拒绝了,但我怀疑你可能会发现以下问题非常适合:

%.so.target: %.so.5
        echo $< >> $(BUILD)/so.targets

SO_TARGETS=$(basename $(shell cat $(BUILD)/so.targets))

makegen: $(TEAM_ROOT)HMI_FORGF/src/src.pro module_dirs $(SO_TARGETS)
%.so.target:%.so.5
echo$<>>$(构建)/so.targets
SO_TARGETS=$(basename$(shell cat$(BUILD)/SO.TARGETS))
makegen:$(团队根目录)HMI\u FORGF/src/src.pro模块\u dirs$(SO\u目标)

也许您正在寻找一个规则来匹配每个现有的*.so文件

makegen: $(TEAM_ROOT)HMI_FORGF/src/src.pro module_dirs $(wildcard *.so)
    ...

但是,如果存在可以生成*.so文件的模式,而这些文件尚未生成这些文件,那么通配符(显然)不会匹配这些模式,通配符只会检查现有文件。如果这是您真正想要完成的,那么您可能希望以某种方式枚举实际的文件。

也许您正在寻找一个规则来匹配每个现有的*。那么文件呢

makegen: $(TEAM_ROOT)HMI_FORGF/src/src.pro module_dirs $(wildcard *.so)
    ...

但是,如果存在可以生成*.so文件的模式,而这些文件尚未生成这些文件,那么通配符(显然)不会匹配这些模式,通配符只会检查现有文件。如果这是您真正想要完成的,那么您可能需要以某种方式枚举实际的文件。

如果在构建时不存在文件,您如何知道它需要哪个文件?你基本上是在告诉make“对于目标makegen,你需要一些文件,处理它”。您必须给它一个变量,该变量包含所需的所有.so文件的名称,%.so目标可以这样翻译:“对于您遇到的任何.so文件,您都需要它,并且您可以这样做”。这里,您的makegen目标是“对于makegen,您需要它和任何.so文件”。它不可能复制您如何知道哪个。所以,如果在您构建时它们不存在,它需要哪些文件?你基本上是在告诉make“对于目标makegen,你需要一些文件,处理它”。您必须给它一个变量,该变量包含所需的所有.so文件的名称,%.so目标可以这样翻译:“对于您遇到的任何.so文件,您都需要它,并且您可以这样做”。这里,您的makegen目标是“对于makegen,您需要它和任何.so文件”。这不可能是一个有意义的复制品