2016-11-15 50 views
6

我一直在尋找這個小時,但不知何故,我仍然沒有找到適合我的東西。Makefile:自動編譯所有c文件,將.o文件保存在單獨的文件夾中

我所擁有的是一個有3個子目錄的目錄。 src/for .c和.h文件,bin /編譯的可執行文件應該去的位置以及obj /我希望.obj文件去的地方。

現在我想讓makefile從src中編譯每個.c文件(不需要我將它們全部列在makefile中),並將.o文件放在obj中,並將由foo.c構建的可執行文件保存爲bin/foo 。

有人可以幫我嗎?每當我使用通配符時,都會抱怨規則不在那裏,當我使用隱式規則時,它不會將對象文件放在單獨的文件夾中。

回答

9

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.oobj/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] 

注意,這有一個大的缺點:是不跟蹤頭文件的依賴性。這可以自動完成,但這是一個微妙的伎倆;它可以等到你掌握了這麼多。

+0

謝謝你的精彩答案。最後的代碼片段實際上並不會構建可執行文件,但添加了這個代碼並沒有問題,並且所有的文件都是我想讓它們成爲的地方:) – Max

+0

最後一個模式規則可能會看起來更好,因爲靜態模式規則是可以接受的。 – bobbogo

+0

@bobbogo:我同意,但我試圖簡單。 – Beta

相關問題