Makefile 带有2个源文件目录的Gnu make

Makefile 带有2个源文件目录的Gnu make,makefile,gnu-make,Makefile,Gnu Make,我正在尝试用GNUMake编译一个c程序,以便将创建的目标文件放在构建目录中。我的项目目录如下所示: | root |--> makefile |--> BuildDir |--> HeadersDir | -> main.h | . | . |--> Modules | -> modules1.c | . | . |--> Program | -> program1.c | . | . 我希

我正在尝试用GNUMake编译一个c程序,以便将创建的目标文件放在构建目录中。我的项目目录如下所示:

| root
|--> makefile
|--> BuildDir
|--> HeadersDir
|    -> main.h
|    .
|    .
|--> Modules
|    -> modules1.c
|    .
|    .
|--> Program
|    -> program1.c
|    .
|    .
我希望从模块和程序源文件创建的所有目标文件都保存在BuildDir中。到目前为止,我有这个makefile

CC = gcc
CFLAGS = -Wall -Wextra -g3 -I./HeaderFiles
LDFLAGS = -lm

# Get all source files
SRCFILES := $(wildcard ./Programs/*.c)
SRCFILES += $(wildcard ./Modules/*.c)

# Generate objective files
OBJFILES = $(patsubst %.c, %.o, $(SRCFILES))
OBJFILES := $(subst ./Programs, ./Build, $(OBJFILES))
OBJFILES := $(subst ./Modules, ./Build, $(OBJFILES))

EXEC = travelMonitor
PARAMETERS =

all: $(OBJFILES) $(EXEC)

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

$(EXEC): $(OBJFILES)
    $(CC) $(CFLAGS) $(OBJFILES) -o $@
有人能帮忙吗?

这条规则:

%.o: %.c
说明如何从
.c
构建
.o
。只有当目标与模式匹配且前提条件存在或可以生成时,规则才能匹配。那么这条规则符合吗

嗯,对于目标
Build/mainformations.o
来说,它确实与模式匹配,带有
Build/mainformations
的茎(与
%
匹配的部分)。有了这个干,先决条件是什么?我们有
%.c
,因此在替换了stem之后,make希望构建必备的
build/main函数.c
。这是否存在?不,你知道怎么做吗?不,所以,这个模式规则不匹配。Make将查找可能匹配的任何其他模式规则,但没有。所以,make告诉你它找不到任何方法来创建这个目标

如果你想把目标文件放在不同的目录中,那么你必须将其编码到你的规则中,否则make就不知道该使用哪个规则;你必须这样写:

Build/%.o : Programs/%.c
        $(CC) $(CFLAGS) -c $< -o $@
Build/%.o:Programs/%.c
$(CC)$(CFLAGS)-c$<-o$@
当然,这不会生成模块源,因此您需要另一条规则:

Build/%.o : Modules/%.c
        $(CC) $(CFLAGS) -c $< -o $@
Build/%.o:Modules/%.c
$(CC)$(CFLAGS)-c$<-o$@

现在它将起作用。

这确实起作用了。谢谢你的解释
Build/%.o : Modules/%.c
        $(CC) $(CFLAGS) -c $< -o $@