C makefile目标特定文件

C makefile目标特定文件,c,makefile,C,Makefile,我试图创建一个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的隐式规则,因此链接

我试图创建一个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

做这件事的正确方法是什么?

例如,你可以这样做(考虑到你不会一次用多个目标调用make):


你是对的。已更正生成errortarget特定变量的最小代码,该变量可在配方中以及同一目标的其他特定目标分配中使用。但是它们在前提条件中不可用(因为它们可能依赖于在确定前提条件之前没有价值的自动变量)。也许有办法做到这一点,但传统的显式先决条件样式似乎更简单。也就是说,如果您从
target1:OBJ=foo1.o foo2.o
中删除
OBJ=
,您将得到同样可维护的
target1:foo1.o foo2.o
:)@EtanReisner:在他们先决条件的配方中,但不是他们先决条件的配方中。阿菲特。将示例生成文件更改为
target1:prereq=foo
target1:target2
target2:$(prereq)
\techo$^
,但它仍然不打印任何内容。(这实际上是我最初的测试,基于OP。)(但是将
echo$(prereq)
添加到target2的配方中,你可以看到它在这一点上确实有一个值。)@EtanReisner:好的,谢谢,但我对
制作
并不完全有把握。我刚刚学会了一些技巧,其中一些是通过艰苦的方式学会的。特定于目标的变量很有诱惑力,但我并不总是能正确预测行为,这就是为什么我在评论之前尝试了它,以及为什么我评论而不是回答。尽管我会支持这样的建议,即仅仅写出先决条件并不比列出具体目标的先决条件清单更费力,至少在这种情况下,而且所需的思考要少得多。:)@Etan:将特定于目标的变量设置继承到先决条件的先决条件中的一种可能方法是使用递归make调用,注意导出特定于目标的变量。谢谢你的回答。
OBJ := foo1.o foo2.o

ifeq "$(MAKECMDGOALS)" "target2"
OBJ := foo3.o foo4.o
endif

target1 target2: application

application: $(OBJ)
    $(LD) $^