ファイルが中間ファイルであり、自動的に削除できることをmakeに伝えるものは何ですか?

ファイルが中間ファイルであり、自動的に削除できることをmakeに伝えるものは何ですか?

私はただ作る方法を学んでいます。私は誤ってmakeの中間ファイルの自動削除に関する問題を発見しました。私はmakeがファイルの途中をどのように表示するのか(たとえば、「自動的に削除されますか?」と答えた)をよりよく予測したかったので、私の問題を示すために次のようなダミープロジェクトを作成しました。

こんにちは。h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif

こんにちはc

#include <stdio.h>

void hello(const char *name) {
    printf("Hello %s\n", name);
}

メインプログラム

#include "hello.h"
int main() {
    hello("world");
    return 0;
}

ファイルの生成

all: main
    ./main

clean:
    rm -f *.o *.a
    rm -f main

hello.o:
    gcc -c hello.c

libmyhello.a: hello.o
    ar -crv $@ hello.o

main: libmyhello.a
    gcc -L. -o $@ [email protected] -lmyhello

.PHONY: all clean

私が作成するとmain時間がかかりますlibmyhello.alibmyhello.a必須hello.o.正しく理解したら、hello.o中間ファイルでなければなりません。しかしそれは削除されない進行中ですmake main

なぜ? makeがファイルを中間ファイルとして扱って削除するかどうかはどうすればわかりますか?

ベストアンサー1

中間ファイルはデフォルトで暗黙のルールチェーンでのみ生成され、いいえ目標または前提条件として明示的に言及されます。あなたの場合、作成したすべてのファイルはMakefileに明示的に記載されているため、中間ファイルではありません。

ファイルを前提条件として一覧表示して、ファイルを中間ファイルにすることができます.INTERMEDIATE

.INTERMEDIATE: hello.o

一般的に言えば、変更がなくても再構築するには再libmyhello.a構築が必要なので、より多くの作業が必要です。 (しかし、これを前提条件としてリストする必要があります。)hello.ohello.chello.chello.o

バラより関連付けられた暗黙的なルールの中間ファイルに関する部分詳細については、GNU Makeのマニュアルを参照してください。

おすすめ記事