我正在尝试使用 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.
有人可以帮忙吗?
答案 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 $@
现在它可以工作了。