1

首先,我对 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

但是,正如您所看到的,虽然prog2与 完全无关prog1.c,但编辑prog1.c将导致重新链接prog2. 有什么办法可以防止这种情况发生吗?

(另外,如果有人能指导我学习 GNU Make 的好教程,我将不胜感激。官方文档非常庞大......)

4

1 回答 1

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

有很多很多的方法可以使这个更复杂并减少打字。这就是 make 的全部意义所在。

更新

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

all: prog1 prog2

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

all第一个目标在哪里。

于 2013-04-03T21:17:54.997 回答