2016-06-10 45 views
0

我編譯我的C源代碼文件,此代碼:遍歷文件列表中的Makefile

CC=clang -std=c11 
CFLAGS=-Wall -g 
ASSEMBLY=-S -masm=intel 
OPTIMIZE=-Ofast 

FOLDER_SRC=./src/ 
FOLDER_BIN=./bin/ 
FOLDER_ASSEMBLY=./ass/ 

clean: 
    rm -f \ 
    $(FOLDER_BIN)1.1-hello $(FOLDER_ASSEMBLY)1.1-hello \ 
    $(FOLDER_BIN)1.2-fahrenheit $(FOLDER_ASSEMBLY)1.2-fahrenheit \ 
    $(FOLDER_BIN)1.2-fahrenheit-floating $(FOLDER_ASSEMBLY)1.2-fahrenheit-floating 

all: 
    $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.1-hello.c -o $(FOLDER_BIN)1.1-hello 
    $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit.c -o $(FOLDER_BIN)1.2-fahrenheit 
    $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit-floating.c -o $(FOLDER_BIN)1.2-fahrenheit-floating 

assembly: 
    $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.1-hello.c -o $(FOLDER_ASSEMBLY)1.1-hello 
    $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit.c -o $(FOLDER_ASSEMBLY)1.2-fahrenheit 
    $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit-floating.c -o $(FOLDER_ASSEMBLY)1.2-fahrenheit-floating 

我嘗試實現某種循環少寫。我加入這個代碼,但它只是產生錯誤:

FILENAME_SRC := $(wildcard $(FOLDER_SRC)*.c) 
FILENAME_BUILD := $(patsubst $(FOLDER_SRC)%.c,%,$(FILENAME_SRC)) 

echo : $(FILENAME_SRC) 
    @echo $^ 
    @echo $(FILENAME_BUILD) 

build : $(FILENAME_SRC) 
    $(CC) $(CFLAGS) $(OPTIMIZE) $^ -o $(FILENAME_BUILD) 

make echo打印此控制檯:

$ make echo 
src/1.2-fahrenheit.c src/1.1-hello.c src/1.2-fahrenheit-floating.c 
1.2-fahrenheit 1.1-hello 1.2-fahrenheit-floating 

make build命令生成此錯誤:

$ make build 
clang -std=c11 -Wall -g -Ofast src/1.2-fahrenheit.c src/1.1-hello.c src/1.2-fahrenheit-floating.c -o 1.2-fahrenheit 1.1-hello 1.2-fahrenheit-floating 
clang.exe: error: no such file or directory: '1.1-hello' 
clang.exe: error: no such file or directory: '1.2-fahrenheit-floating' 
make: *** [Makefile:21: build] Error 1 

我想預期的輸出看起來像當我這樣做make all

$ make all 
clang -std=c11 -Wall -g -Ofast ./src/1.1-hello.c -o ./bin/1.1-hello 
clang -std=c11 -Wall -g -Ofast ./src/1.2-fahrenheit.c -o ./bin/1.2-fahrenheit 
clang -std=c11 -Wall -g -Ofast ./src/1.2-fahrenheit-floating.c -o ./bin/1.2-fahrenheit-floating 

最終解決

CC := clang -std=c11 
GCC := gcc -std=c11 
CFLAGS := -Wall -g 
ASSEMBLY := -Wall -S -masm=intel 
OPTIMIZE := -O3 -march=native 

SRC := $(wildcard src/*.c) 
BIN := $(patsubst src/%.c,bin/%,$(SRC)) 
ASS := $(patsubst src/%.c,ass/%,$(SRC)) 

clean: 
    rm -f bin/* ass/* 

build: $(BIN) 
$(BIN): bin/%: src/%.c 
    $(CC) $(CFLAGS) $(OPTIMIZE) $^ -o [email protected] 

assembly: $(ASS) 
$(ASS): ass/%: src/%.c 
    $(CC) $(ASSEMBLY) $(OPTIMIZE) $^ -o [email protected] 

clean ass/*雖然真的很抱歉,它不能被稱爲assembly,因爲該項目的類似文件夾的名稱。

回答

2

all規則需要看起來像

CC := clang 
CFLAGS := -std=c11 -Wall -g -Ofast 

targets := bin/1.1-hello bin/1.2-fahrenheit bin/1.2-fahrenheit-floating 

.PHONY: all 
all: $(targets) 
$(targets): bin/%: src/%.c 
    $(LINK.c) $^ $(LDLIBS) -o [email protected] 
+0

這個確切的代碼creatint以下錯誤信息:'使:***沒有規則,使目標的SRC/1.2 farenheit.c',由需要'本/ 1.2-華氏'。 Stop.' – Lanti

+0

對不起,它的工作原理,你錯誤地輸入了'fahrenheit',這就是爲什麼我的電腦不能編譯。 – Lanti

+1

@Lanti糟糕,固定。 – user657267