1

我有一个旧项目,我正在尝试为其创建多个二进制文件,目录中的每个对象一个。我一生都无法弄清楚如何以这种方式处理多个目标。以下作品,但在我看来,我应该能够有一个规则将它们全部联系起来,可以这么说,

 # 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 $@
4

1 回答 1

2

约定是在 Makefile 的顶部有这样的内容:

.PHONY: all
all: bin bar

因此make all将 make binand bar,并将其放在顶部,它是make不带参数的默认目标。将其.PHONY:记录为“元目标”,但也指示 Make 运行它,即使碰巧有一个all使用新日期戳调用的文件。

%: %.o
     $(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)

这告诉 Make 如何制作它们。

于 2013-10-07T15:32:24.703 回答