
私はただ作る方法を学んでいます。私は誤って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.a
。libmyhello.a
必須hello.o
.正しく理解したら、hello.o
中間ファイルでなければなりません。しかしそれは削除されない進行中ですmake main
。
なぜ? makeがファイルを中間ファイルとして扱って削除するかどうかはどうすればわかりますか?
答え1
中間ファイルはデフォルトで暗黙のルールチェーンでのみ生成され、いいえ目標または前提条件として明示的に言及されます。あなたの場合、作成したすべてのファイルはMakefileに明示的に記載されているため、中間ファイルではありません。
ファイルを前提条件として一覧表示して、ファイルを中間ファイルにすることができます.INTERMEDIATE
。
.INTERMEDIATE: hello.o
一般的に言えば、変更がなくても再構築するには再libmyhello.a
構築が必要なので、より多くの作業が必要です。 (しかし、これを前提条件としてリストする必要があります。)hello.o
hello.c
hello.c
hello.o
バラより関連付けられた暗黙的なルールの中間ファイルに関する部分詳細については、GNU Makeのマニュアルを参照してください。