Makefile不调用规则依赖项

时间:2017-04-25 10:34:44

标签: makefile

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

该目录只包含一个.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列表,那为什么不构建randomImages

1 个答案:

答案 0 :(得分:1)

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

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