我有一个旧项目,我正在尝试为目录中的每个对象创建一个多个二进制文件。我不能为我的生活弄清楚如何以这种方式处理多个目标。以下是有效的,但在我看来,我应该能够有一条规则将它们全部联系起来,可以这么说,
# compile objects, no problem
%.o: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
bin: bin.o
$(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)
bar: bar.o
$(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)
我开始工作的一种方法是从目标名称中删除后缀,并在一步中编译和链接,但感觉有点hackish,
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $< ../lib/libfoo.a -lm -o $(*F)
免责声明:我鄙视制作
更新1:这就是我最终的结果
EXECS = bin bar ...
all: $(EXECS)
%: %.c
@echo "Building $@ from $<"
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@.o
$(CC) $(CFLAGS) $(CPPFLAGS) $@.o ../lib/libfoo.a -lm -o $@
答案 0 :(得分:2)
惯例是在Makefile的顶部有这样的东西:
.PHONY: all
all: bin bar
因此make all
将bin
和bar
,并将其置于顶部,它是make
无参数的默认目标。 .PHONY:
将此文档记录为“metatarget”,但也指示Make运行它,即使恰好有一个名为all
的文件带有新的日期戳。
%: %.o
$(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)
这告诉Make如何制作它们。