2

次のMakefileを検討してください。

CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o

UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o 
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o

# All objects
%.o:    %.cpp %.hpp
    $(CC) $(CFLAGS) $<

# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
    $(CC) $(EFLAGS) % $< $(UTILITIES)

# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
    #$(CC) $(EFLAGS) $@ $@.cpp $(UTILITIES)

(実行可能ファイルの)match-anythingルールにより、端末に次のように入力できるようになります。

make TS_CG

TS_CGという実行可能ファイルをコンパイルします。ただし、makeすべて一致するターゲットは使用しません。代わりに、デフォルトのコンパイルルールを使用します。

一方、UTILITIESにリストされているすべてのオブジェクトが存在する場合は、すべて一致するターゲットを使用します。したがって、マッチングは前提条件の存在に依存しているようです。

どうやら:

ルールがターミナルの場合、その前提条件が実際に存在しない限り、ルールは適用されません。

マニュアル作成による)。しかし、私のルールは終末ではありません。二重コロンでマークされていません!

では、なぜこれがまだ当てはまるように見えるのでしょうか?

また、ファイルで実行しようとしたように、オブジェクトターゲットと実行可能ターゲットを区別するためのより良い解決策があるかどうかを尋ねる場合もあります。

4

1 に答える 1

0

UTILITIESがまだ存在しない場合でも、MakeがTS_CGを構築できることに驚いています。これは、TS_CGがTS_CGを必要としていることを認識していないためです。

とにかく、MakeがTS_CGのルールを見つけようとしているとき、見つけたのは暗黙のルールだけです(TS_CGに固有のものは何もありません)。特に、指定した%: %.cpp $(UTILITIES)%: %.cppとが組み込まれています。$(UTILITIES)がすべて存在する場合は、最初のルールを使用します。それ以外の場合は、リストを下に移動して、前提条件が存在するルールを探します。そして2番目を見つけます。前提条件が存在するルールが見つからない場合にのみ、前提条件を構築するためのルールを探すことになります。

于 2010-06-21T01:51:26.043 に答える