【发布时间】:2015-10-14 20:33:30
【问题描述】:
我正在尝试制作一个编译两个不同文件集的 makefile 文件。这可能吗?
到目前为止我尝试的是:
target1: OBJ = foo1.o foo2.o
target1: application
target2: OBJ = foo3.o foo4.o
target2: application
application: $(OBJ)
$(LD) $(OBJ)
发生的情况是 LD 使用正确的参数调用,但 make 从未真正检查依赖关系,因此将 .c 文件编译为 .o 的隐式规则永远不会执行,因此链接器失败:
ld: cannot find foo1.o: No such file or directory
ld: cannot find foo2.o: No such file or directory
这样做的正确方法是什么?
【问题讨论】:
-
你是对的。更正了产生错误的最小代码
-
目标特定变量可在 recipe 和同一目标的其他目标特定分配中使用。但是它们在先决条件中不可用(因为它们可能依赖于在先决条件确定之前没有价值的自动变量)。也许有办法做到这一点,但似乎传统的显式先决条件样式更简单。也就是说,如果你从
target1: OBJ = foo1.o foo2.o中删除OBJ =,你最终会得到同样可维护的target1: foo1.o foo2.o。 :) -
@EtanReisner:在他们的先决条件的recipes中,但不是他们先决条件的先决条件。 AFAICT。将示例 Makefile 更改为
target1: prereq=footarget1: target2target2: $(prereq)\techo $^,它仍然没有打印任何内容。 (这实际上是我最初的测试,基于 OP。)(但是将echo $(prereq)添加到 target2 的配方中,您可以看到它在那时确实有一个值。) -
@EtanReisner:嗯,谢谢,但我对
make的看法并不完全可靠。我刚刚学会了一些技巧,其中一些是很难的。特定于目标的变量很诱人,但我并不总是正确地预测行为,这就是我在评论之前尝试它的原因,也是我评论而不是回答的原因。尽管我会坚持这样的建议,即仅写出先决条件并不比制作特定于目标的先决条件列表更工作,至少在这种情况下,它需要的思考要少得多。 :) -
@Etan:将特定于目标的变量设置继承到先决条件的一种可能方法是使用递归 make 调用,注意
export特定于目标的变量。但是很好。