2016-12-27 58 views
0

我在make linux makefile時出錯。這裏是我的代碼:C中的Makefile錯誤linux

CC = gcc 
CFLAGS = -Wall -m32 -g -fno-stack-protector -z execstack -O0 
SHELL_SOURCES = Shell.c 

SHELL = Shell 

.PHONY: all target1 clean 

all: target1 

target1: $(SHELL) 

$(SHELL): $(SHELL_SOURCES) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

clean: 
rm -rf $(SHELL) 

我得到的錯誤是:

gcc -Wall -m32 -g -fno-stack-protector -z execstack -O0 Shell.c -o Shell 
make: Shell: Command not found 
Makefile:16: recipe for target 'Shell' failed 
make: *** [Shell] Error 127 

回答

3

你不能在Makefile中使用SHELL作爲變量,它用於知道你的Makefile中將使用什麼shell(/ bin/sh,/ bin/bash等)。

CC = gcc 
CFLAGS = -Wall -m32 -g -fno-stack-protector -z execstack -O0 
EXE_SOURCES = Shell.c 

EXE = Shell 


.PHONY: all target1 clean 

all: target1 

target1: $(EXE) 

$(EXE): $(EXE_SOURCES) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

clean: 
    rm -rf $(EXE) 
+1

更準確地說,'$(SHELL)'用於運行規則中的每個* action行,並且由於在運行第一個動作時'Shell'不存在,所以'make'正在抱怨。 –

2

需要更多的時間來閱讀documentation of GNU make

您應該刪除周圍變量賦值,例如空間代碼

CC= gcc 

當心標籤字符是Makefile -s顯著(在rules,對於它們的作用線)。使用一些編輯器意識到這一點(例如emacs有一個Makefile模式)。另請參閱this示例(但規則操作應該真的以選項卡字符開頭)。值得注意的是,您需要在$(CC) $(CFLAGS) $^ -o [email protected]之前的標籤以及另一個rm之前。

還可以考慮使用remake-x調試你Makefile,或至少make --trace

但主要的錯誤的確,作爲answered by Cpatricio,使用SHELL variable。使用variables or names already knownmake時要小心。其實,我有一個共同的前綴前綴我make變量名的習慣,所以你可以定義你的變量,如JOJOIGA_SOURCES=$(wildcard *.c)JOJOIGA_SHELL=Shell等....

+0

是的,我原來的代碼有標籤..有一些麻煩複制代碼完全一樣。多謝:) – Jojoiga