Makefile 为不同目录中的文件创建隐式规则

Makefile 为不同目录中的文件创建隐式规则,makefile,dependencies,Makefile,Dependencies,我正试图按照中描述的步骤,使用make自动生成依赖项。对于源文件和对象文件都位于同一目录中的简单情况,提供的方法是有效的。但是,如果我有以下文件树: src helloworld.cpp 生成文件 垃圾箱 如果我使用以下生成文件: CPPFLAGS += -MD -MP BIN_DIR=../bin SRC = $(wildcard *.c) hello_world: $(SRC:%.c=$(BIN_DIR)/%.o) $(LD) -o $@ $^ -include $(S

我正试图按照中描述的步骤,使用
make
自动生成依赖项。对于源文件和对象文件都位于同一目录中的简单情况,提供的方法是有效的。但是,如果我有以下文件树:

  • src
    • helloworld.cpp
    • 生成文件
  • 垃圾箱
如果我使用以下生成文件:

CPPFLAGS += -MD -MP
BIN_DIR=../bin

SRC = $(wildcard *.c)

hello_world: $(SRC:%.c=$(BIN_DIR)/%.o)
    $(LD) -o $@ $^

-include $(SRC:%.c=$(BIN_DIR)/%.d)
然后我得到这个错误消息:

make: *** No rule to make target `../bin/helloworld.o', needed by `hello_world'. Stop.
并且没有生成.d文件

据我所知,当试图应用隐式规则来生成
。/bin/helloworld.o
时,问题就出现了,因为相应的源文件是
helloworld.cpp
,而不是
。/bin/helloworld.cpp


是否可以描述使用不在同一目录中的两个文件创建隐式规则?

可以:为
$(SRC:%.c=$(BIN_DIR)/%.o)添加规则

不建议这样做:这不是常见的做法,在
bin
目录中包含
*.o
文件也不是一个好主意


通常的做法是让
make
读取和写入同一目录中的文件,一旦所有内容都编译好,使用单独的
install
步骤将编译后的软件复制到最终位置,通常称为。

hello_world
还是
helloworld
?错误消息与生成文件不一致。