2011-04-11 60 views
3

makefile文件的一種常見類型有這樣的線自動列表:GNU使替換命令中的目標文件

OBJS=something.o other.o third.o progname.o 

progname: $(OBJS) 

那麼您可以運行make progname。但是GNU Make也可以從它在當前目錄中看到的所有c文件生成o-files列表本身。這是如何完成的?

基本上,我希望能夠將C文件添加到目錄而不必更改生成文件。

(是例如通過一些殼魔法,或者是有這個內置的功能?)

回答

3

要查看所有定義的規則(包括隱含規則),請發出make -p

但是,知道如何從源文件生成目標文件的事實並不意味着它應該應該這樣做。 Make會盡量做到最低限度,以達到你要求它建立的目標。

如果你想使編譯所有源代碼轉換成目標在當前目錄下,您將需要一個規則,將取決於所有的對象,例如:

all: $(patsubst %.c,%.o,$(wildcard *.c)) 
+1

我冒昧地從'shell ls * .c'更改爲'wildcard * .c',因爲它更便於攜帶。 – 2011-04-11 07:33:37

+0

謝謝,@Amigable克拉克康德,確實'$(shell ls)'是醜陋的做法,而且您的解決方案當然更清晰。 – 2011-04-11 07:40:58

+0

謝謝你回答我的問題。 :-) – 2011-04-11 07:52:02

1

您可以擴展shell命令給你的文件列表。您也可以使用implicit rules

+0

好的,爲了完整,怎麼樣? – 2011-04-11 06:39:06

+0

您必須查看該頁面上的文檔。基本的想法是make讓大家知道如何從大量的「標準」程序的源文件中創建某些二進制文件。您可以使用這些知識來簡單地告訴它「這是目標 - 從適當命名的來源構建它」。自從我使用過製作已經過去3年以來,我無法給你舉例,它已經從我的腦海中轉移了出來。 – 2011-04-11 06:41:19

0

這是可以做到這樣的:

$(ODIR)/%.o: %.cpp 
    $(CC) -c $(CFLAGS) -o [email protected] $< 

進行從它在當前目錄中的.cpp文件名生成.o文件名。

+0

感謝您的示例。 :) – 2011-04-11 06:44:25

+0

但是這個規則已經不存在了嗎? – 2011-04-11 06:45:52

+0

@Amigable克拉克康德:不,你自己定義它 – weekens 2011-04-11 06:48:03

3

也可以這樣做:

SRCS = $(wildcard *.c) 
OBJS = $(SRCS:.c=.o) 

progname: $(OBJS) 

如果其中有main()的目標文件是「progname.o」,那麼它就可以正常工作。