【问题标题】:Multiple targets but same dependency多个目标但相同的依赖项
【发布时间】:2020-11-21 20:49:58
【问题描述】:

这是我的 makefile 的一部分:

SRC     =   ./
DIRS    =   src libs/maths libs/struct
BIN_DIR =   ./bin/

SRC_DIRS=   $(foreach dir, $(DIRS), $(addprefix $(SRC), $(dir)))
SRC_TEST=   $(sort $(SRC_DIRS))

SRCS    =   $(foreach msrc, $(SRC_DIRS), $(wildcard $(msrc)/*.c))

DEL_PRE =   $(foreach target, $(SRCS), $(notdir $(target)))
ADD_PRE =   $(foreach target, $(DEL_PRE), $(addprefix $(BIN_DIR), $(target)))
OBJS    =   $(ADD_PRE:.c=.o)

.PHONY: all clean re

all:        $(EXEC)

$(EXEC):    $(OBJS)
    $(CC) $(OBJS) -o $@ $(LDLIBS)

$(OBJS):    $(SRCS)
    $(CC) -o $@ -c $<

当我使用 make all 时,我有输出:

gcc -o bin/main.o -c src/main.c
gcc -o bin/cosin.o -c src/main.c
gcc -o bin/pears.o -c src/main.c
gcc -o bin/outil.o -c src/main.c
gcc -o bin/verif.o -c src/main.c

但我想为每个目标分配依赖关系:

gcc -o bin/main.o -c src/main.c
gcc -o bin/cosin.o -c libs/maths/cosin.c
gcc -o bin/pears.o -c libs/maths/pears.c
gcc -o bin/outil.o -c libs/struct/outil.c
gcc -o bin/verif.o -c libs/struct/verif.c

我该如何解决?

【问题讨论】:

    标签: c linux gcc makefile


    【解决方案1】:

    这似乎是一个非常普遍的误解;我昨天刚刚有效地回答了同样的问题。我不确定它来自哪里或如何对抗它。

    这条规则:

    $(OBJS):    $(SRCS)
           $(CC) -o $@ -c $<
    

    不会以某种方式神奇地将OBJS 变量和SRCS 变量的内容组合起来以找出它们是如何匹配的。变量引用简单展开,结果是这样的:

    bin/main.o bin/cosin.o ... : src/main.c libs/maths/cosin.c ...
           $(CC) -o $@ -c $<
    

    这就像你写这个一样:

    bin/main.o : src/main.c libs/maths/cosin.c ...
           $(CC) -o $@ -c $<
    bin/cosin.o : src/main.c libs/maths/cosin.c ...
           $(CC) -o $@ -c $<
    ...
    

    现在,您有望看到编译同一个文件的原因:在每个规则中,您都有相同的先决条件,因此$&lt; 始终是第一个,也始终是src/main.c

    有多种方法可以解决这个问题,但如果您真的想将来自不同目录的所有源文件编译到同一目录中的目标文件中,您的工作就更难了,因为没有通用的模式可以匹配它们。在这种情况下,最简单的做法是使用VPATH for directory search:将上述规则替换为:

    $(BIN_DIR)/%.o : %.c
           $(CC) -o $@ -c $<
    

    然后告诉 make 如何找到你的源文件,像这样:

    VPATH := $(sort $(dir $(SRCS))
    

    请注意,此方法不能用于任何源文件,这些源文件本身是 make 预期创建的输出。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多