2015-11-02 79 views
0

我有一個不斷拋出的錯誤一個Makefile:沒有規則,使目標 '的Startup.s'

make: *** No rule to make target 'startup.s', needed by 'all'. Stop.

我已經創建了一些變量:

OUT_DIR = ./Build 

SOURCE_DIR = ./Src 

SOURCES = main.c 
SOURCES += startup.s 

OBJECTS = $(SOURCES:.c=.o) 
OBJECTS += $(SOURCES:.s=.o) 

,這裏是我的目標:

all: setup $(OBJECTS) 
    @echo "Done!" 

setup: 
    @mkdir -p $(OUT_DIR) 

%.o : $(SOURCE_DIR)/%.c 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/[email protected] 
    @echo 

%.o : $(SOURCE_DIR)/%.s 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/[email protected] 
    @echo 

爲什麼不能找到startup.s的目標,它應該使用la st target %.o : $(SOURCE_DIR)/%.s

+0

那不是目標。 %.o將成爲目標,並且使找不到與.s文件匹配的文件。 $(SOURCE_DIR)/%。s是依賴項。基本上你需要爲%.s文件制定一個規則 – DTSCode

+0

@DTSCode'.s'文件是源文件。他們沒有建成。製造商將其視爲目標的事實本身就是問題。 –

+0

@EtanReisner的權利,這是因爲他列出它作爲依賴沒有配方 – DTSCode

回答

2

您沒有startup.s的目標。您有一個目標使用.s文件(來自$(SOURCE_DIR)目錄)。

startup.s應該是一個已存在的文件,並且可以將編譯成對應的.o文件。你的$(OBJECTS)變量不包含你認爲它的作用。

認爲它包含main.o startup.o但它沒有。它實際上包含main.o startup.s main.c startup.o。 (每個替換引用只會更改匹配的值,它會直接傳遞不匹配的值。)

您需要將$(filter)調用添加到這些行以執行所需操作。

這是問題所在。你不小心告訴make在當前目錄下建立一個startup.s文件,它不知道該怎麼做。

由於此makefile的其他問題,您的%.o規則不會創建與目標模式匹配的文件,這會混淆make。請參閱GNU Make維護者的Makefiles規則中的Rule 2。 (規則3在這裏也有些相關。)

+0

啊!這就是問題,hank @Etan –

相關問題