首先,我不熟悉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的好教程,我真的很感激。官方文档非常庞大......)
答案 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
是第一个目标。