從foo.c
建立foo.o
,本地:
foo.o: foo.c
$(CC) -c $< -o [email protected]
爲了做同樣的,但在src/
任何需要的頭文件:
SRC := src
foo.o: foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
做相同,但與源文件在src/
:
SRC := src
foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
要做到這一點,但放在obj/
對象文件:
SRC := src
OBJ := obj
$(OBJ)/foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
圖案規則將做任何這樣的目標文件(obj/foo.o
,obj/bar.o
,...):
SRC := src
OBJ := obj
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o [email protected]
要創建所需的對象列表:
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
而要覆蓋所有的規則:
all: $(OBJECTS)
全部放在一起:
SRC := src
OBJ := obj
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
all: $(OBJECTS)
$(CC) $^ -o [email protected]
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o [email protected]
注意,這有一個大的缺點:是不跟蹤頭文件的依賴性。這可以自動完成,但這是一個微妙的伎倆;它可以等到你掌握了這麼多。
謝謝你的精彩答案。最後的代碼片段實際上並不會構建可執行文件,但添加了這個代碼並沒有問題,並且所有的文件都是我想讓它們成爲的地方:) – Max
最後一個模式規則可能會看起來更好,因爲靜態模式規則是可以接受的。 – bobbogo
@bobbogo:我同意,但我試圖簡單。 – Beta