2

だから、メイクファイルを理解しようとしています。現時点では、多かれ少なかれ互いに依存していないいくつかのモジュールを含むプロジェクトがあります。

私のディレクトリツリーは次のようなものです:

root/
- Source/ <-- referenced as $(INPUTPATH)
- Build/ <-- referenced as $(BUILDPATH)
- Release/ <-- referenced as $(OUTPUTPATH)
- Makefile

ソース ( .cpp/ .h) を Source/ に、オブジェクトを Build/ に、実行可能ファイルを Release/*に配置したいと考えています。

したがって、私の考えは、いくつかの異なるターゲットを持ち、次のように使用することでした:

all: maps auxiliars methods
    @echo "linking...";\
    $(CC) $(CFLAGS) $(OBJS) $(CLIBS) -o ${OUTPUTPATH}/MainProgram

dependency1: $(INPUTPATH)/foo.cpp
    @echo "compiling ArbPrecision...";\
    cd ${BUILDPATH};\
    $(CC) $(CFLAGS) $(CINCLUDE) -c ../$?

dependency2: dependency1 $(INPUTPATH)/bar.cpp
    @echo "compiling saddleConstructor...";\
    cd ${BUILDPATH};\
    $(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/bar.cpp

maps: dependency2 $(INPUTPATH)/*Map.cpp
    @echo "compiling maps...";\
    cd ${BUILDPATH};\
    $(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/*Map.cpp
... (auxiliars and methods)

$CINCLUDE と CFLAGS は、ヘッダーや外部ライブラリのような単なるコンパイラ関連のものです。

すべてがほぼ完璧に機能します。すべてのターゲットで、他のターゲットの依存関係と、ソースの *cpp を要求します。これが存在しない場合は、ターゲットを呼び出して *cpp をコンパイルします。実行可能ファイルはエラーなしで作成されます。

ただし、「make」を 2 回呼び出すと、ソースに変更を加えなくても、コンパイルにかかる時間は 1 回目と 2 回目で同じになります。したがって、明らかに、依存関係を正しく設定していません。

このコンパイルを実行するための正しい方向を教えてくれる人はいますか? 私は何か間違ったことをしていて、それが何であるかを理解していません。

ありがとう、ホルヘ

4

1 に答える 1

3

Make はファイルを操作することを期待しています。ルールごとに、そのルールによって指定されたターゲットファイルが (1) 存在し、(2) 最新である (つまり、その依存関係の後に変更されている) かどうかをチェックします。ファイルが最新でない場合は、ルールを実行してファイルを最新にします。

したがって、makefile が現在書き込まれているため、 を実行するmakeと、Make は次のことを行います。

  • allは最初のルールなので、引数を指定しない場合、make はそのallルールを処理します。
  • 指定されたファイルがall存在しないため、allルールを実行する必要があります。
  • alldependency1ルールによります。指定されたファイルがdependency1存在しないため、dependency1ルールを実行する必要があります。
  • dependency1dependency2ルールによります。指定されたファイルがdependency2存在しないため、dependency2ルールを実行する必要があります。

代わりに、次のようなものが必要です。

OBJS := foo.o bar.o Map.o

all: $(OUTPUTPATH)/MainProgram

$(OUTPUTPATH)/MainProgram: $(OBJS)
    $(CC) $(CFLAGS) $(OBJS) $(CLIBS) -o $(OUTPUTPATH)/MainProgram

%.o: %.cpp
    $(CC) $(CFLAGS) $(CINCLUDE) $< -c $@

.PHONY: all

次の点に注意してください。

  • Make はファイルを操作するため、ルールのターゲットと依存関係は可能な限りファイル名でリストされます。
  • .cpp ファイルを個別にリストするのではなく、パターン ルールを使用して各 .o ファイルを作成します。パターン ルール内では、自動変数$<および$@ 自動変数を使用して、それぞれ最初の前提条件 (ファイル) とターゲット (ファイル) を指定します。
  • Make はデフォルトでコマンドをエコーするので、echo自分で行う必要はありません。
  • GNU Make の場合 Makeallが.all
于 2012-10-16T12:39:44.977 に答える