12

メイクファイルの設定方法を学んでいるのですが、問題が発生しました。これを実証するために、ソース ファイルmain.mtest.m.

これらのファイルをコンパイルするようにmakeをセットアップしようとしています(何かが変更された場合のみ)、オブジェクトファイルを別の場所に保存しようとしています(ここbuild/

私のメイクファイル:

OBJ = ./build

SOURCES=main.m test.m
OBJECTS=$(addprefix $(OBJ)/,$(SOURCES:.m=.o))
EXECUTABLE=test

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        gcc $(OBJECTS) -o $(EXECUTABLE)

$(OBJECTS): $(OBJ)/%.o: %.m build/
        gcc -c $< -o $@

build/:
        mkdir build

初めて実行すると (現在のディレクトリに Makefile とソースのみを使用して)、期待どおりに動作します。

gcc -c main.m -o build/main.o
gcc -c test.m -o build/test.o
gcc ./build/main.o ./build/test.o -o test

ただし、makeもう一度実行すると:

gcc -c main.m -o build/main.o
gcc ./build/main.o ./build/test.o -o test

私は何を間違えましたか?また、「良い」Makefile を作成する方法を学ぼうとしているので、Makefile の他のエラーに注意してください。

編集:

私が見つけたものmake -d

Finished prerequisites of target file `build/main.o'.
Prerequisite `main.m' is older than target `build/main.o'.
Prerequisite `build/' is older than target `build/main.o'.
No need to remake target `build/main.o'.

Finished prerequisites of target file `build/test.o'.
Prerequisite `test.m' is older than target `build/test.o'.
Prerequisite `build/' is newer than target `build/test.o'.
Must remake target `build/test.o'.
4

1 に答える 1

12

出力make -dmake、ビルド ディレクトリが更新されたと考えているため、ファイルを再構築する必要があることを示しています。

これは、ビルド システム側またはファイル システム内の別の操作によって、そのディレクトリのタイムスタンプが更新されているために発生していると思います。

そのルールにa を追加して注文のみの前提条件buildを作成することで、問題を解決できます。|

$(OBJECTS): $(OBJ)/%.o: %.m | build

/何もしていないので、これも削除しました。

あなたが尋ねたので、他の編集上のメモ:

  1. ターゲットを追加しcleanます。何かのようなもの:

    clean:
        rm -rf $(EXECUTABLE) $(OBJ)
    
  2. ./を設定するときは必要ありませんOBJ。だけOBJ = buildで十分です。

  3. 上記のよう/に onは必要ありません。buildしかし、とにかくそれを参照するべきではないので、それは実際には問題ではありません. 見build$(OBJ)ところに置き換えます。

  4. mkdirディレクトリがすでに存在する場合は失敗します。-おそらく、そのコマンドの前に:を付ける必要があります。

    $(OBJ):
        -mkdir $(OBJ)
    

    $(OBJ)上記の #3 で述べたものに置き換えたことに注意してください。

  5. 依存関係の自動生成は非常に役立ちます。表示されているプロジェクトは、実際に必要なほど大きくはありませんが、追加するのは簡単です。いくつかのことを行う必要があります。まず、適切な依存ファイル名を取得します。

    DEPFILES = $(addprefix $(OBJ)/,$(SOURCES:.m=.d))
    

    -MMD次に、フラグを追加して、コンパイラにそれらを生成させます。

    gcc -MMD -c $< -o $@
    

    最後に、makefile の末尾に次の行を追加して、利用可能な場合は makefile に含めます。

    -include $(DEPFILES)
    
于 2013-05-24T20:53:40.580 に答える