2016-11-21 6 views
0

%ルールにディレクトリの依存関係を指定:Cプロジェクトについて非常に奇妙なメイクの行動私は簡単なメイクファイルの以下の非常に奇妙な行動観察

をさんは、私がコンパイルするためのn> = 2の.cファイルを持っているとしましょうディレクトリに保存します。

OBJDIR = obj 

all: $(OBJDIR)/a.o $(OBJDIR)/b.o 
$(OBJDIR): 
     mkdir $(OBJDIR) 
$(OBJDIR)/%.o: %.c $(OBJDIR) 
     gcc -c $< -o [email protected] 

だから、a.oとb.oがコンパイルされ、新しいフォルダOBJに置かれている必要があります。たとえば

あなたは

私のメイクファイルがあるコンパイルするためa.cとb.cを持っていると仮定します。 同じフォルダに.cと.oファイルを置くのが面倒だと思っています。また、何かの理由でgitを使ってプロジェクトをアップロードすると、空のフォルダを追跡しないため、フォルダが存在しない場合は作成します。

私のWindowsマシンでは正常に動作し、私がしたいことをします。

make 
mkdir obj 
gcc -c a.c -o obj/a.o 
gcc -c b.c -o obj/b.o 
make 
make: Nothing to be done for 'all'. 

しかし、私のLinuxマシン上で、次のことを行います。

make 
mkdir obj 
gcc -c a.c -o obj/a.o 
gcc -c b.c -o obj/b.o 
make 
gcc -c a.c -o obj/a.o 
make 
gcc -c b.c -o obj/b.o 
make 
gcc -c a.c -o obj/a.o 
make 
gcc -c b.c -o obj/b.o 

私はここでしかコマンドを作成しました。他の行はmakeの仕事です。私はサイクリングの行動がかなり迷惑であることを知ります。

どうしてですか?

答えて

1

これは、Makeルールが、ディレクトリがよりも古いため、が.oファイルよりも欲しいからです。

しかし、オブジェクトをコンパイルしてディレクトリに入れると、ディレクトリは更新され、.oファイルよりも新しいものになります。

ので:

$(OBJDIR)/%.o: %.c $(OBJDIR) 

古いある%の.oのを見て、と反応します。

私はエレガントな回避策があった覚えているが、クイックフィックスは

$(OBJDIR)/%.o: %.c $(OBJDIR) 
gcc -c $< -o [email protected] 
touch [email protected] 
+2

「エレガントな回避策がありました」でなければなりません。あなたは[注文のみの前提条件](https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html)を考えているかもしれません。 – kaylum

関連する問題