使计算通配符太早? 我有一个make文件,或多或少,下面的结构编译C++源代码: .PHONY: all all: compile_obj_files my_binary # This rule generates the object files. It works fine afaik. .PHONY: compile_obj_files compile_obj_files: $(MAKE) --file=child.makefile # my_binary is a real binary file that I wish to build. my_binary: $(wildcard *.o) $(CC) $(wildcard *.o) -o my_binary

使计算通配符太早? 我有一个make文件,或多或少,下面的结构编译C++源代码: .PHONY: all all: compile_obj_files my_binary # This rule generates the object files. It works fine afaik. .PHONY: compile_obj_files compile_obj_files: $(MAKE) --file=child.makefile # my_binary is a real binary file that I wish to build. my_binary: $(wildcard *.o) $(CC) $(wildcard *.o) -o my_binary,makefile,linker,compilation,Makefile,Linker,Compilation,在第一次运行时,此make文件生成了所有对象文件,但$(通配符*.o)返回了一个空列表。在第二次运行时,它没有编译任何东西,正如预期的那样,$(通配符*.o)确实返回了所有的对象文件。它看起来像是在创建所有对象文件之前执行$(通配符*.o),尽管my\u binary规则总是在compile\u obj\u文件之后运行。我坐在这个脚本上,看起来很无助,根本不知道这里出了什么问题(一定有点傻)。你能想到什么吗?你真的不应该在规则中使用$(通配符…),而是应该像这样做 MYSRC:=$(wildca

在第一次运行时,此make文件生成了所有对象文件,但
$(通配符*.o)
返回了一个空列表。在第二次运行时,它没有编译任何东西,正如预期的那样,
$(通配符*.o)
确实返回了所有的对象文件。它看起来像是在创建所有对象文件之前执行
$(通配符*.o)
,尽管
my\u binary
规则总是在
compile\u obj\u文件之后运行。我坐在这个脚本上,看起来很无助,根本不知道这里出了什么问题(一定有点傻)。你能想到什么吗?

你真的不应该在规则中使用
$(通配符…
),而是应该像这样做

MYSRC:=$(wildcard *.c)
MYOBJ:=$(patsubst %.c, %.o, $(MYSRC))

%.o: %.c
        $(CC) -c $< -o $@

my_binary: $(MYOBJ)
        $(CC) $^ -o $@

重要的一点是,在构建
my_binary
时,
OBJS
的值是一致的。通过这种方式,您可以将构建明确地分为两个步骤,并且在执行第二个make之前读取对象文件列表。

您不应该在规则中使用
$(通配符…
),而应该执行类似的操作

MYSRC:=$(wildcard *.c)
MYOBJ:=$(patsubst %.c, %.o, $(MYSRC))

%.o: %.c
        $(CC) -c $< -o $@

my_binary: $(MYOBJ)
        $(CC) $^ -o $@

重要的一点是,在构建
my_binary
时,
OBJS
的值是一致的。通过这种方式,您可以清楚地将构建分为两个步骤,并在执行第二个make之前读取目标文件列表。

谢谢。我不确定我是否能够轻松地实施此解决方案。我的文件分散在不同的目录中,因此很难计算所有的名称。这就是为什么我看起来更容易检查所有编译的对象。我将尝试实现它,但是,为什么我的解决方案不起作用?我的通配符表达式不是应该在规则求解时计算吗?+1,这基本上就是我要说的。请注意,“:=”使其在使用时重新计算。如果改为使用“=”,它只会在顶部计算一次值。T.E.D.,实际上是相反的。这是GNU Make手册中的一句话:“简单扩展的变量是由使用“:=”的行定义的。简单扩展变量的值被扫描一次,并且全部(…)它包含了它们的(变量)值,直到定义这个变量为止。”JasperE,为什么我不应该在规则中使用$(通配符)?您不想扩展
$(通配符…)
每次计算规则时。在规则的命令中,您希望使用自动变量,如
$Thank。我不确定是否可以轻松实现此解决方案。我的文件分散在不同的目录中,因此很难计算所有的名称。这就是为什么我只需检查所有编译的对象看起来更容易的原因。我将尝试im请记住,但无论如何,为什么我的解决方案不起作用?我的通配符表达式不是应该在解决规则时进行计算吗?+1,这基本上就是我要说的。请注意,“:=”使它在使用时重新计算。如果改为使用“=”,它只会在顶部计算一次值。t.E.D.,实际上是另一种方法这是GNU Make手册中的一段引语:“简单扩展的变量由使用“:=”的行定义。简单扩展的变量的值被扫描一次,并且从定义该变量时起(…)它包含它们的(变量)值。”JasperE,为什么我不应该在规则中使用$(通配符)?您不想扩展
$(通配符…
每次计算规则时。在规则的命令中,您希望使用自动变量,例如
$