ショボ短歌会

現在A,B,Cの複数のターゲットに対する以下のようなMakefileをかいております。

SRC = A.cc B.cc C.cc
TGT = $(basename $(SRC))

all:TGT

A: A.cc
g++ A.cc -o A
B: B.cc
g++ B.cc -o B
C: C.cc
g++ C.cc -o C

A,B,Cに対する動作は同じであるため共通化して書きたいのですが、何か良い方法はありますでしょうか?
patdubdt, for each等を用いて記述しようとしましたがうまくいきませんでした。

ご存知の方おられましたらご教授よろしくお願いいたします。

A 回答 (2件)

「もう少し詳しく書くと」って書いてるけど, 元の質問文にある Makefile と #1 のお礼にある Makefile って, 全然違うんだよね....



さておき, 最悪 foreach や eval を駆使すればできるが, そこまでせずとも静的パターンルールを使って
$(MAIN): %: %.o $(OBJ)
gcc $^ -o $@
でいけそうな気はする.
    • good
    • 0
この回答へのお礼

最近Makefileの勉強を始めたものですみません。
コロンを二回続けれるのは初めて知りました。
これでいけました。
ありがとうございます。

お礼日時:2011/09/22 20:26

makeにもいくつか種類があるので、詳細はそのmakeのマニュアルとかを参考にしてほしいのですが



具体的に「どうやったら」「どううまくいかなった」のでしょう?
このような時には、自動変数 $@,$< 等を使ったり、暗黙のルールを使ったりします。

A: A.cc
B: B.cc
C: C.cc

%: %.cc
  g++ %< -o $@
とか
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

実はA,B,Cはメインプログラムです。
ライブラリを作成するのにsuffix ruleを用いています。もう少し詳しく書くと、

SRC = A.c B.c C.c
MAIN = $(basename $(SRC))
OBJ = D.o F.o
all:$(MAIN)

A:A.o $(OBJ).o
gcc $^ -o $@
B:B.o $(OBJ).o
gcc $^ -o $@
C:C.o $(OBJ).o
gcc $^ -o $@
%.o:%.c
 gcc -c $< -o $@

のような感じです。
A,B,Cのルールを
$(MAIN):$(patsubst %,%.o,$(MAIN)) $(OBJ)
gcc $< -o $@
のようにすると
A B C: A.o B.o C.o $(OBJ)
のように展開されているようでmain fileが複数あるとのエラーが出ます。
また
foreachを使ってうまくできないかと思ったのですが、こちらもとん挫してしまいました。
mainfileをmain_A.C, main_B.c, main_D.cなどとして、名前にmainを含むものは、、、といった書き方にすればよいのでしょうか?

お礼日時:2011/09/18 11:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!