GNU Make:同一目标中几个二进制文件的不同依赖关系?

时间:2013-04-03 20:56:26

标签: c makefile dependencies target

首先,我不熟悉GNU Make,所以如果我说出一些可笑的错误概念,请纠正它们而不是取笑我,谢谢。

我希望有一个默认目标来构建具有不同依赖关系的多个可执行文件,但我无法弄明白。这是我正在使用的最小例子:

    CC = gcc-4.8
    CFLAGS = # some compiler flags
    LDFLAGS = # some linker flags
    SOURCES = prog1.c prog2.c
    OBJECTS = $(SOURCES:.c=.o)
    TARGET = prog1 prog2

    $(TARGET) : $(OBJECTS)
            $(CC) $(CFLAGS) -o prog1 prog1.o $(LDFLAGS)
            $(CC) $(CFLAGS) -o prog2 prog2.o $(LDFLAGS)

    .PHONY: clean

    clean:
            @rm -f $(TARGET) $(OBJECTS) core

但是,正如您所看到的,虽然prog2prog1.c完全无关,但修改prog1.c会导致prog2重新链接。有什么方法可以阻止这种情况吗?

(另外,如果有人能指导我参加GNU Make的好教程,我真的很感激。官方文档非常庞大......)

1 个答案:

答案 0 :(得分:0)

每个目标必须有自己的一套先决条件;如果你写:

foo bar: biz baz

这意味着“foo取决于biz和baz,而bar也取决于biz和baz”。你想写:

prog1: prog1.o
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
prog2: prog2.o
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)

或者,您可以在同一规则中编写两个目标并分别定义先决条件:

prog1 prog2:
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
prog1: prog1.o
prog2: prog2.o

有很多方法可以让它更复杂并减少打字。这就是结果的全部。

<强>更新

默认情况下,要同时构建两个目标,请使用

all: prog1 prog2

prog1 prog2:
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
prog1: prog1.o
prog2: prog2.o

其中all是第一个目标。