2009-08-28 13 views
12

makeファイルを作成するために必要なC++コードがいくつかあります。それぞれの.hと.Cのペアはオブジェクトを作成し、いくつかのオブジェクトをリンクして実行可能ファイルを形成します。かなり標準的なもの。gmakeはディレクトリ内のすべてのファイルをコンパイルします

この非GNU makeをコマンドは、ちょうどこれは何が行うことは、それぞれ%の.Cファイル(つまり、すべての.Cファイル)のための対応の.oファイルを作成されているディレクトリにオブジェクトに

%.o:%.C 
    $(CC) $(CPFLAGS) -c $< 

をすべてのファイルを作成します。

誰もがgmakeでこれを行う方法を知っていますか?

乾杯

マーク

答えて

19

あなたが示した構文は、GNU make parlanceのパターンルールと呼ばれ、ソリューションのコーナーストーンを形成します。 .Cファイルのリストを動的に取得する方法を追加するだけです。他にもこれを行うために$(shell)を使用するソリューションが示されていますが、それは不必要に非効率的です。あなたはより簡潔な何かを探している場合は、次のことがあまりにも動作します

SRCS = $(wildcard *.C) 
OBJS = $(patsubst %.C,%.o,$(SRCS)) 
foo: $(OBJS) 
     $(CC) -o [email protected] $^ 

%.o: %.C 
     $(CC) $(CPFLAGS) -c $< 

:私はあなたの代わりにGNUだけで、この目的のために設計された組み込み関数を作るとなる、$(ワイルドカード)を使用することをお勧め

foo: $(patsubst %.C,%.o,$(wildcard *.C)) 

これは単に変数を削除し、GNU makeがデフォルトの%.o: %.Cパターンルールと、実行ファイルをオブジェクトのセットから一緒にリンクするためのデフォルトルールを提供するという事実を利用します。個人的には、より詳細なバージョンを使用すると、読んだり維持したりするのが簡単になりますが、それぞれ独自のバージョンになります。

あなたは間違っている

エリックMelski

1

これはpattern ruleの一例であり、それはgmakeで正常に動作する必要があります。このような非常にシンプルなビルドの場合、ほとんどはimplicit rulesに依存することができます。あなたが持っている主なものは、あなたが構築したいターゲットとその依存関係で指定します

CXXFLAGS:=-g -O -Iincludes 
LDFLAGS:=-lm 

SRCS:=$(shell ls *.C)   # select all .C files as source 
OBJS:=$(substr .C,.o,$(SRCS) # list the corresponding object files 

foo : $(OBJS) 

注意の量を減らすことができsimply expanded variable代入演算子(:=)ではなく、再帰代入演算子(=)の使用再処理はより複雑なビルドで行います。

+0

、お役に立てば幸いです。 OPは静的なパターンルールではなく、標準的なパターンルールを示しています。$(ワイルドカード)が追加のオーバーヘッドなしでこのトリックを行うここで$(シェル)を使用する理由はありません。 –

+0

@ Eric:もちろん、静的パターンルールを修正します。一定。私はしばしばコマンドを一般化するので、余分なフォークにもかかわらず$(シェル)をたくさん使います。 = =割り当てを使うことで、私は彼に余分な苦しみを1度しか与えません。 – dmckee

+0

あなたは好きなだけ=と$(ワイルドカード)を簡単に使うことができます: –

関連する問題