所以這裏是我的問題:爲什麼下面的makefile無法構建目錄中唯一的.c
文件?我有一個非常簡單的makefile來構建我的操作系統內核,並且出於某種原因,它不構建kernel
規則所需的.c
文件。Makefile不調用規則依賴關係
該目錄僅包含一個.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 [email protected]
%.o: %.c
gcc $(GCCPARAMS) -c $< -o [email protected]
%.o: %.s
as $(ASPARAMS) $< -o [email protected]
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
?
@Olaf感謝您刪除C標籤,它實際上並不是一個相關的標籤,我忘了在發佈前刪除它。 –
將$(OBJ_FILES)添加到內核規則的先決條件中。 – Wurmloch