3

makefile では、すべての .o ファイルをビルドディレクトリにビルドします。

program: class1.o class2.o class3.o
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o $@

$(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o依存関係リストから生成するのはクールでしょう...

スペースで区切られたすべての依存関係のリストが表示されることはわかってい$^ますが、サブディレクトリを処理できません。

出来ますか ?

持っている場合、リストからprogram: class1.o class2.o class3.o configure除外できますか?configure

ありがとうございました :)

編集:マイケルのソリューションはうまく機能しますが、それを行うと、make依存関係が見つからず、毎回すべてをビルドする必要があります...のような暗黙のルールを作成するときに、ビルドディレクトリprogram: class1.o class2.o class3.oにバイナリを配置するように指示する簡単な方法はありませんか?

4

2 に答える 2

5

私の頭の上から

g++ $(addprefix $(BUILDDIR), $^) -o $@

するべきです。

Make マニュアルのセクション 8.3 にこれらの関数のリストがあります。

于 2010-03-03T21:02:00.373 に答える
5

Make の大きな欠点のうち 2 つ (あるいは 3 つ) を見つけました。そこのファイルを使用してファイルをここに作成するのは得意ですが、その逆ではありません。ルールが正確なターゲット以外のものを作成すると混乱します(自動変数は前提条件で機能するはずですが、機能しません)。幸いなことに、これらの問題を回避することができます。

Make は $(BUILDDIR)class1.o ではなく class1.o を探しているため、Michael Kohne のソリューションを使用すると前提条件を見つけることができません。(そして、単に VPATH を使用して $(BUILDDIR) を調べるように指示すると、別の問題が発生する可能性があります。)

最も単純で大雑把な解決策 (あまり経験がない場合は、この方法をお勧めします) は力ずくです:

名前 = クラス 1 クラス 2  
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES))

プログラム: $(OBJECTS) configure
    g++ $(オブジェクト) -o $@

$(OBJECTS):$(BUILDDIR)%.o:%.cc
    g++ -c $^ -o $@

より高度な手法を使用したより洗練されたソリューションがありますが、今のところはこれで十分です。

于 2010-03-06T04:39:42.527 に答える