2011-07-16 97 views

回答

3

模式的規則是你的朋友對這些情況。只要你的目標都符合可預測的模式,並且他們在這種情況下也是如此,因爲它們都是「從foo.c創建foo」的形式 - 你可以編寫一個將用於所有目標的模式規則:

OtherOpt=-Wall -g 
all: $(patsubst %.c,%,$(wildcard *.c)) 
%: %.c 
     gcc $(OtherOpt) -o [email protected] -lthelibname $< 

現在,你可以簡單地運行到make建立所有的應用程序,或make appname構建特定的應用程序。在這裏,我創建了一個單一模式規則,您可以在任何時候使用something.c創建something。我使用了[email protected]自動變量,該變量將擴展爲輸出的名稱,並使用$<變量,該變量將擴展爲第一個先決條件的名稱,以便命令行無論正在構建的特定應用程序如何都是正確的。從技術上講,你不需要all行,但我想你可能不想總是必須輸入你想要構建的應用程序的名稱。在技​​術上,如果沒有這個makefile的任何,技術上你可能會離開,因爲GNU make已經有了一個關於%: %.c關係的內置模式規則!我只是爲了完整而提到這個選項;就我個人而言,我更喜歡按照我在這裏展示的方式來做事情,因爲它會更清楚地說明發生了什麼。

1
%.o: %.c 
    gcc $(OtherOpt) -c -o [email protected] -lthelibname $< 

將所有.c文件編譯爲其具有相同基本名稱的.o文件(目標代碼)。然後在您的實際目標中,您將包含所有必需的.o文件作爲依賴關係,並使用gcc $(OtherOpt) -o [email protected] $^ -lthelibname,假設我沒有誤解您的構建設置。

某些版本的make也支持後綴規則.c.o幾乎與%.o: %.c一樣,但後綴規則不能有任何依賴關係。編寫.c.o: foo.h告訴make將「foo.h」編譯爲「foo.c.o」,而不要求「foo.h」作爲任何具有.c後綴的文件的依賴關係,因爲%.o: %.c foo.h會正確執行。

+0

每個c文件都包含足夠的單個目標代碼。我想用單一規則獲得所有目標。 – Galaxy

1

我從http://sourceforge.net/projects/gcmakefile/ learnd

LDLIB  = -lpthread 
LDFLAGS = -Wl,-O1 -Wl,--sort-common -Wl,--enable-new-dtags -Wl,--hash-style=both $(LDLIB) 
SRCDIRS = 

SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp 

CFLAGS = -pipe -march=core2 -mtune=generic -Wfloat-equal \ 
#-Wall -pedantic 

ifeq ($(SRCDIRS),) 
    SRCDIRS = . 
endif 
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) 
TARGET = $(addprefix bin/,$(basename $(SOURCES))) 

all: $(TARGET) 
    ls -l $(TARGET) 

bin/%: %.c dir 
    gcc $(CFLAGS) $(LDFLAGS) -o [email protected] $< 

dir: 
    @-mkdir bin 

.PHONY : clean 
clean: 
    -rm $(TARGET) 
    -rmdir bin