2017-04-25 128 views
0

所以這裏是我的問題:爲什麼下面的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 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

+0

@Olaf感謝您刪除C標籤,它實際上並不是一個相關的標籤,我忘了在發佈前刪除它。 –

+1

將$(OBJ_FILES)添加到內核規則的先決條件中。 – Wurmloch

回答

1

您需要將您的目標文件定義爲內核規則的先決條件,因爲內核規則依賴於它們。它只是間接地依賴於源文件。

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

是的,完全錯過了。此外,與錯誤無關,我忘了在'ld'後面添加$(LDPARAMS),並且還鍵入了'A_FILES'而不是'S_FILES',但它工作正常! –