2013-03-31 241 views
4

我是使用make的新手,並通過this tutorial瞭解了基礎知識。下面是本教程的最後一個例子生成文件例如:Makefile頭依賴關係

IDIR =../include 
CC=gcc 
CFLAGS=-I$(IDIR) 

ODIR=obj 
LDIR =../lib 

LIBS=-lm 

_DEPS = hellomake.h 
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) 

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 


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

hellomake: $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 

.PHONY: clean 

clean: 
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

這應該做工精細假設所有.c文件只包括hellomake.h,但如果每個.c文件中包括不同的頁眉這是行不通的。是否有可能編寫知道每個.c文件中包括一個makefile,所以我沒有去和做手工,如:

foo.o: foo.c something.h 
    ... 

bar.o: bar.c somethingelse.h 
    ... 

,因爲這似乎是這將是一個巨大的浪費時間。

+0

的[Makefile文件,標題依賴性(http://stackoverflow.com/questions/2394609/makefile-header-dependencies) –

回答

13

假設foo.c有一行:

#include "something.h" 

你想在makefile行:

foo.o: foo.c something.h 

gcc編譯器可以構造線爲您服務。該命令

gcc -MMD -c -o foo.o foo.c 

將建立foo.ofoo.d其中包含了線。 (試試吧。)

所以只要修改Makefile來生產這些* .d文件,包括他們,你就大功告成了:

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

-include $(ODIR)/*.d 

(進一步的改進是可能的,如指定其中*。 d文件應該去。)

+0

謝謝,這是非常有幫助的可能的複製。 –

+0

'$(DEPS)'應該在你的例子的第一行嗎? –

+0

@ user2228139:[聳肩]我把它放進去了,但我想這不是必須的。 – Beta

0

傳統制作是相當有限,迫使你自己做所有基本的東西。如果您正確地期望構建工具找到依賴關係並知道鏈接,請嘗試makepp。你可能不需要一個makefile所有,或只是最低限度的人喜歡

CFLAGS = -O3 
myprog:    # just a default target to know what to build 

連結部將需要在你的身邊有一點幫助,因爲它是一個基於源代碼頭對。如果myprog.cpp包括a.hb.hpp它會查看它是否可以構建a.o和/或b.o,如果是,將鏈接它們並遞歸地檢查它們的源代碼包含哪些內容。

如果您有更復雜的要求,您只需要瞭解更多的語法。但是,如果你這樣做,沒有限制。除了幾乎所有的GNU make功能之外,還有更多有用的東西,甚至可以用一些Perl編程擴展makefile。

0

是的,「MMD」標誌將幫助您生成「.d」文件(依賴項)文件。如果你包含在你的Makefile結尾(-include * .d),然後如果你在.h文件中做任何改變,相應的.o文件將會重建。

以此爲參考: https://github.com/saanvijay/makefile-skeleton