2011-07-22 54 views
1

我正在嘗試設置一個生成自動相關性的Makefile。我紅色這個頁面http://make.paulandlesley.org/autodep.html並寫我自己的Makefile:Makefile自動相關性問題

編輯: 我做了一些更改下面的Beta註釋。 現在,所有文件和makefile都處於同一級別。 但沒有更多的運氣。

CC = gcc 
LD = gcc 
RM = rm -rf 
MAKEDEPEND = gcc -M $(CFLAGS) $(INCLUDE) -o $*.d $< 

CFLAGS = -Wall -g 

INCLUDE = -I/usr/include/CUnit 
LIB = -llibcunit 

SRC = lib_dac.c 
SRC += main.c 

OBJS = $(SRC:.c=.o) 

PROG = tests 

all: $(OBJS) 

%.o : %.c 
    $(MAKEDEPEND); \ 
     cp $*.d $*.P; \ 
     sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
     -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \ 
     rm -f $*.d 
    $(CC) -c $(CFLAGS) $(INCLUDE) -o [email protected] $< 

-include $(SRCS:.c=.P) 

PHONY: clean 

clean: 
    $(RM) *.o *.exe 
    $(RM) *.P 

但我無法得到它的工作。當我觸摸lib_dac.h時,依賴於lib_dac.c什麼也沒有發生。 我錯過了什麼嗎?

感謝您的幫助。

+0

歡迎對語法的任何評論。 – Nicolas

回答

1

MAKEDEPEND正在爲您提供lib_dac.o的相關性,而不是src/lib_dac.o。當Make嘗試生成src/lib_dac.o時,它不知道lib_doc.h被涉及。

有幾種方法可以解決這個問題,但選擇取決於您想如何處理目標文件(例如lib_dac.o)。我注意到您定義了一個BIN_PATH,但不要使用它;而是在src中構建對象。這是你的意圖嗎?

編輯:
這裏是速戰速決,使對象文件bin/。 (請擅長用文件建立文件這裏,而不是周圍的其他方式。)

OBJS = $(patsubst %.c,bin/%.o,$(SRC)) 

bin/%.o : %.c 
    ... 

vpath %.c src 
+0

謝謝,我改變了我的makefile並將它移到了souce目錄中。我不明白的是什麼時候makefile查找依賴關係?我可以看到它何時創建它們,但不能在它使用它們時看到。 – Nicolas

+0

@Nicolas:使用'-include $(SRCS:.c = .P)',將依賴關係合併到makefile中。 – Beta

+0

是的,我知道。所以每個文件都有兩個規則。一個是%o:%c,另一個是使用MAKEDEPEND創建的。我對嗎 ? – Nicolas

0

好吧,我發現在我的makefile一個錯字。在包括我寫的$SRCS而不是$SRC。該死的複製/粘貼。

它現在運行良好,但目前所有的文件都在同一個目錄中,我不太喜歡那樣。

但是依賴生成工作,所以問題解決了。

+0

你想要什麼文件?也許我們可以幫忙。 – Beta

+0

那麼,我喜歡在一個文件夾src和bin文件夾中的二進制文件的來源。通常我會將makefile放在這兩個目錄之上。 – Nicolas