我想寫一個Makefile我的項目,所有的*.c
和*.h
文件是一個名爲src
文件夾中,和Makefile文件看起來是這樣的 -的Makefile:通配符和patsubst不改變文件源名稱
CC := gcc
CFLAGS := -g -Wall -ansi -pedantic -std=gnu99
LDFLAGS := -lm
INCLUDES := $(wildcard src/*.h)
IFLAGS := $(addprefix -I/,$(INCLUDES))
SRC := $(wildcard src/*.c)
OBJS := $(patsubst %.c, %.o, $(SRC))
APP := app
all: $(OBJS)
$(APP): $(OBJS)
$(CC) $(CFLAGS) $< -o [email protected] $(LDFLAGS)
$(OBJS): $(SRC) $(INCLUDES)
$(CC) $(CFLAGS) $(IFLAGS) -c $< -o [email protected]
clean:
rm -rf $(OBJS)
rm -rf *.out
rm -f $(APP)
在這一點上我不生成可執行,只是想將它們編譯到目標文件,所以當我跑,我得到這個輸出 -
gcc -g -Wall -ansi -pedantic -std=gnu99 -I/src/structure.h -I/src/rng.h -c src/allocate.c -o src/allocate.o
gcc -g -Wall -ansi -pedantic -std=gnu99 -I/src/structure.h -I/src/rng.h -c src/allocate.c -o src/auxiliary.o
gcc -g -Wall -ansi -pedantic -std=gnu99 -I/src/structure.h -I/src/rng.h -c src/allocate.c -o src/decode.o
gcc -g -Wall -ansi -pedantic -std=gnu99 -I/src/structure.h -I/src/rng.h -c src/allocate.c -o src/display.o
你可以看到,在每個gcc
調用,如此urce文件名不會改變,它們全部總是src/allocate.c
爲什麼?但是,對象名正確地展開,如src/allocate.o
,src/auxiliary.o
和src/decode.o
等。
目標'clean'和'all'是假目標,因爲不會生成具有這些名稱的文件。因此,在這些目標的第一個之前需要有一行:'.PHONY:clean all' – user3629249