3

Makefileは中間ファイルを削除していません。設定しまし.INTERMEDIATEた。これが私のMakefileです:

OBJECTS=prefixer.o stack.o
CFLAGS=-Werror -Wmissing-prototypes -g
LIBS=-lm
CC=gcc

prefixer : $(OBJECTS)
    $(CC) -o prefixer $(OBJECTS) $(LIBS)

prefixer.o : stack.h
    $(CC) -c prefixer.c -o $@ $(CFLAGS)
stack.o : stack.c stack.h
    $(CC) -c stack.c -o $@ $(CFLAGS)

.INTERMEDIATE: %.o

.PHONY: clean
clean : 
    -rm prefixer *.o

何が問題になってい.INTERMEDIATEますか?

4

3 に答える 3

8

Gnuがの役割のために特別なターゲットを作るを参照してください.INTERMEDIATE

あなたはおそらく意味します

 .SECONDARY:  $(OBJECTS)

なぜなら、あなたが置く.INTERMEDIATEと、オブジェクトは常に削除されると思うので、おそらくそれは望まないでしょう。%.o特別なターゲットの前提条件として意味のあるものとして置くことはできないと思います。

再コンパイルに時間を無駄にしないように、オブジェクトファイルを保持することをお勧めします。

一度実行すると、知っているmake -pルールについて多くのことを学ぶことができます。make

少なくとも複雑な-sをデバッグするには、使用remake -x (つまり、 remake )が非常に役立ちます。Makefile使用することもできますmake -dが、冗長すぎると思います。

makeたとえば、 omakeよりも優れたビルダーを使用することをお勧めします。

于 2012-07-29T13:11:08.780 に答える
4

特別なターゲットはワイルドカード.INTERMEDIATEでは機能しません。%これを試して:

.INTERMEDIATE: stack.o prefixer.o
于 2012-07-29T13:14:20.227 に答える
0

私が理解している限り.INTERMEDIATE、中間ファイルがすでに存在する場合、それを削除することは想定されていません。これは、gnumakeのドキュメントからのものです。

中間ファイルは、他のすべてのファイルと同じように、ルールを使用して再作成されます。ただし、中間ファイルは2つの方法で異なる方法で処理されます。

最初の違いは、中間ファイルが存在しない場合に何が起こるかです。通常のファイルbが存在せず、makeがbに依存するターゲットを考慮する場合、makeは常にbを作成し、bからターゲットを更新します。ただし、bが中間ファイルの場合、makeは十分にそのままにしておくことができます。bの前提条件がそのターゲットよりも新しいか、そのターゲットを更新する他の理由がない限り、bまたは最終的なターゲットを更新する必要はありません。

2番目の違いは、makeが他の何かを更新するためにbを作成する場合、それが不要になった後でbを削除することです。したがって、makeの前に存在しなかった中間ファイルは、makeの後にも存在しません。makeは、削除するファイルを示す'rm -f'コマンドを出力して、削除を報告します。

*.oしたがって、makeを実行する前に、ディレクトリにがないことを確認してください。

于 2012-07-29T13:13:06.420 に答える