生成文件不调用规则依赖项



所以我的问题来了:为什么以下makefile无法构建目录中唯一的.c文件?我有一个相当简单的 makefile 来构建我的操作系统内核,由于某种原因,它没有构建构建kernel规则所需的.c文件。

该目录仅包含一个.c文件和以下Makefile

GCCPARAMS = -m32 -ffreestanding -Wall -Wextra -nostdinc -nostdlib
GPPPARAMS = -m32 -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti -nostdinc -nostdlib
ASPARAMS = --32
LDPARAMS = -m32 -ffreestanding -O2 -nostdlib
C_FILES := $(wildcard *.c)
CPP_FILES := $(wildcard *.cpp)
S_FILES := $(wildcard *.s)
OBJ_FILES := $(C_FILES:.c=.o) $(CPP_FILES:.cpp=.o) $(S_FILES:.s=.o)
all: kernel
%.o: %.cpp
g++ $(GPPPARAMS) -c $< -o $@
%.o: %.c
gcc $(GCCPARAMS) -c $< -o $@
%.o: %.s
as $(ASPARAMS) $< -o $@
kernel: $(C_FILES) $(CPP_FILES) $(A_FILES)
ld -r $(OBJ_FILES) -o ../kernel.o

如您所见,我的列表中显然有 $(C_FILES)。但是,运行make allmake kernel会产生以下输出:

ld -r core.o   -o ../kernel.o
ld: cannot find core.o: No such file or directory
Makefile:23: recipe for target 'kernel' failed
make: *** [kernel] Error 1

现在,我已经调用了添加到kernel规则中的打印例程来测试C_FILES变量,该变量实际上确实打印core.c(目录中.c文件),并且链接器显然收到了OBJ_FILES列表,那么为什么它不构建core.c

您需要将目标文件定义为内核规则的先决条件,因为内核规则依赖于它们。它仅间接依赖于源文件。

kernel: $(C_FILES) $(CPP_FILES) $(A_FILES) $(OBJ_FILES)
ld -r $(OBJ_FILES) -o ../kernel.o

最新更新