2009-04-24 19 views
1

私はmakefileを初めて使用しています。私は次のmakefileを作成しました。それは正しく動作します。しかし、main.cppを変更してを実行するとになると、は "すべて最新です"と表示されます。私はを行う必要がありますをきれいにして、もう一度makeを実行してください。すべて動作します。makefileはプログラムの更新された部分をビルドしていません - C++

このメイクファイルに問題があるように見えますが、どこが間違っているのか分かりません。誰でもこのメイクファイルのどこにエラーがあり、変更されたファイルをビルドしていないのかを知る手助けはできますか?

#Main makefile which does the build 

CFLAGS = 
CC = g++ 
PROG = fooexe 

#each module will append the source files to here 
SRC := 

#including the description 
include foo/module.mk 

OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) main.o 

#linking the program 
fooexe: $(OBJ) 
    $(CC) -o $(PROG) $(OBJ) 

%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

main.o: 
    $(CC) -c main.cpp 

depend: 
    makedepend -- $(CFLAGS) -- $(SRC) 

.PHONY:clean 
clean: 
    find . -name "*.o" | xargs rm -vf 
    rm -vf fooexe 

答えて

5

通常、.oファイルは対応する.cppファイルに依存する必要があります。私は、これは構文だと思いますが、100%確実ではない:

%.o : %.cpp 
    $(CC) ... 

main.o : main.cpp 
    $(CC) ... 
+0

あなたは男です。それはうまくいった。私はそれを忘れてしまった。 –

+0

"..."の代わりに正しいコマンドを入力することは、変更したファイルのみを再作成する場合にも重要です。 – bk1e

+0

メインビットは冗長です。...はどちらの場合も同じテキストを表します。 –

0

デバッグをオンにしてmakeを実行し、取得した内容を確認します。

メイクはそれほど古いコードなので、あなたが望むと思っていることはかなり確実です。

あなたが.oファイルを見つけるために使用しているという事実は、実際のところにサブディレクトリがあると思います。そうであれば、Makeがそれらを見ることができることを確認する必要があります。

+0

私はmakeがそれらを見ることができると確信しています。それはきれいな後にうまく動作するので。問題は、最初のビルドの後です。 –

1

main.cppを使用してあなたのルール - main.oが - に依存するmain.oのために何が指定されていません。 main.o:main.cppとなる必要があります。また、main.oが依存する他のソースファイルも必要です。

私はあなたがmakedependを使って依存ルールを持っているのを見ます。正しく使用していますか?

main.o: main.c main.h otherstuff.h 
otherstuff.o: otherstuff.c otherstuff.h
5
%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 
:私は実行時に続いて、私は次のような行を取得し、「依存します」

depend: 
    mv Makefile Makefile.bak 
    sed '/^#DO NOT DELETE THIS LINE$$/,$$d' Makefile.bak > Makefile 
    echo '#DO NOT DELETE THIS LINE' >> Makefile 
    echo '#' >> Makefile 
    $(CC) -MM *.c >> Makefile 

# 
#DO NOT DELETE THIS LINE 
#

:私はそれを自分自身を使用していないが、私は常に次のようなもので、私のmakefileを終了します

これは、 ".oファイルが必要であり、存在しない場合は、.cppファイルのすべてに$(CC)を実行して、$(SRC)というファイルを作成します。何も前提条件がリストされていないため、ファイルが変更されたときに.cppファイルを再コンパイルしません。必要な.oファイルがすでに存在する場合、$(CC)コマンドを実行するためのmakeの理由はありません。

アンディ・ホワイトが示唆したようにあなたは、%.o: %.cppに最初の行を変更した場合の.oファイルが必要とされ、存在しないか、対応する.cppファイルよりも古い、すべての$(CC)を実行するたびに、更新されたルールは今」、作る伝えます.cppファイルの$(SRC)にあります。

これは優れていますが、問題はまだあります。更新されたルールでは、最新のものであっても、すべての.cppファイルが常にコンパイルされます。これを修正するには、ルールのコマンド部分が正しい.cppファイルを正しい.oファイルに再コンパイルする必要があります。あなたはこのように$<(第一前提)と[email protected](ターゲット)として自動変数を使用して行うことができます。

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

GNU Make Manualは、より詳細な説明と詳細を持っています。

+0

それは素晴らしいです。情報をありがとう。私はmakeマニュアルをチェックします。 –

+0

さらにn個のファイルを変更すると、すべてのファイルがn回コンパイルされます。しかし、はい、この答えは正しいです。 +1 –

関連する問題