我想爲一個相同的庫編寫很多小例子程序,每個程序需要gcc $(OtherOpt) -o xxx -lthelibname xxx.c
。如何爲大量單個c文件程序編寫更簡單的makefile?
如何編寫一個沒有數十個tagret行的Makefile?
我想爲一個相同的庫編寫很多小例子程序,每個程序需要gcc $(OtherOpt) -o xxx -lthelibname xxx.c
。如何爲大量單個c文件程序編寫更簡單的makefile?
如何編寫一個沒有數十個tagret行的Makefile?
模式的規則是你的朋友對這些情況。只要你的目標都符合可預測的模式,並且他們在這種情況下也是如此,因爲它們都是「從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
關係的內置模式規則!我只是爲了完整而提到這個選項;就我個人而言,我更喜歡按照我在這裏展示的方式來做事情,因爲它會更清楚地說明發生了什麼。
%.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
會正確執行。
我從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
每個c文件都包含足夠的單個目標代碼。我想用單一規則獲得所有目標。 – Galaxy