所以这是我的问题:为什么以下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 all
或make 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
?
答案 0 :(得分:1)
您需要将目标文件定义为内核规则的先决条件,因为内核规则依赖于它们。它只是间接地来自源文件。
kernel: $(C_FILES) $(CPP_FILES) $(A_FILES) $(OBJ_FILES)
ld -r $(OBJ_FILES) -o ../kernel.o