2016-06-10 43 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