2011-07-22 13 views
1

私は自動依存性生成を行うMakefileを設定しようとしています。私はこのページを赤で表示しますhttp://make.paulandlesley.org/autodep.htmlと私自身のMakefileを書く:Makefileの自動依存性問題

編集: 私はベータ版のコメントに続いていくつかの変更を加えました。 今、すべてのファイルと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

MAKEDEPENDlib_dac.oの依存関係を示しており、src/lib_dac.oの依存関係はありません。 Makeがsrc/lib_dac.oをビルドしようとすると、lib_doc.hが関与していることがわかりません。

これを修正するにはいくつかの方法がありますが、オブジェクトファイルをどのように処理するかによって選択が異なります(lib_dac.oなど)。私はあなたがBIN_PATHを定義しているのに気づきましたが、それを使用しません。代わりにsrcにオブジェクトを作成します。それはあなたの意図ですか?

EDIT:
ここではbin/にオブジェクトファイルを置くための簡単な修正です。 (作ることは、ファイルここを構築するためにそこをファイルを使用してのが得意ですが、その逆ではない。)

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

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

vpath %.c src 
+0

ありがとう、私は私のmakefileを変更し、souceディレクトリに移動しました。私が理解していないことは、makefileがいつ依存関係を探すのでしょうか?私はそれがいつ創造されるのかを見ることができますが、それを使うときは見えません。 – Nicolas

+0

@Nicolas: '-include $(SRCS:.c = .P)'では、依存関係がメイクファイルに組み込まれています。 – Beta

+0

はいわかっています。したがって、各ファイルには2つのルールがあります。 %o:%cのものとMAKEDEPENDで作成されたもの。私は正しい? – Nicolas

0

[OK]を、私は私のメイクのタイプミスを見つけます。私は$SRCの代わりに$SRCSを書きました。ダミーコピー/ペースト。

これはうまくいきますが、現在はすべてのファイルが同じディレクトリにあり、私はそれが本当に好きではありません。

しかし、依存関係の生成が機能するので、問題は解決します。

+0

ファイルはどこにありますか?多分私たちは助けることができます。 – Beta

+0

さて、ソースをsrcフォルダに保存し、バイナリをbinフォルダに入れたい。そして、通常、私はmakefileをそれらの2つのディレクトリの上に置きます。 – Nicolas