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

时间:2021-04-29 17:32:52

标签: makefile gnu-make

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

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

然后输出:

make: *** No rule to make target 'Build/mainFunctions.o', needed by 'all'.  Stop.

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这个规则:

%.o: %.c

说明如何从 .o 构建 .c。只有当目标与模式匹配并且先决条件存在或可以构建时,规则才能匹配。那么这个规则匹配吗?

好吧,对于目标 Build/mainFunctions.o,它确实匹配模式,其词干(与 % 匹配的部分)为 Build/mainFunctions。鉴于这个词干,先决条件是什么?我们有 %.c,所以在替换词干之后,make 想要构建先决条件 Build/mainFunctions.c。那存在吗?不。 make 知道如何制作吗?不。所以,这个模式规则不匹配。 Make 将查找任何可能匹配的 other 模式规则,但没有。所以,make 告诉你它找不到任何方法来创建这个目标。

如果你想把目标文件放在不同的目录中,那么你必须把它编码到你的规则中,否则 make 无法知道使用哪个规则;你必须把它写成:

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

当然,这不会构建 Modules 源,因此您需要另一条规则:

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

现在它可以工作了。