質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Q&A

解決済

1回答

1370閲覧

Makefile の中身の簡略化をしたい

filu

総合スコア13

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

0グッド

0クリップ

投稿2019/08/02 12:51

#Makefileの中身を簡略化したい

現在、4つの実行ファイルを一度に生成するMakefileを作成しています。

makefile

1CXX = gcc 2TARGET = hoge1 hoge2 hoge3 hoge4 3CXXFLAGS = -Wall -pthread 4LIBS = 5 6OBJS = $(addsuffix .o,$(TARGET)) 7 8all: $(TARGET) 9 10hoge1: hoge1.o 11 $(CXX) $(CXXFLAGS) -o $@ $< $(LIBS) 12 13hoge2: hoge3.o 14 $(CXX) $(CXXFLAGS) -o $@ $< $(LIBS) 15 16hoge3: hoge3.o 17 $(CXX) $(CXXFLAGS) -o $@ $< $(LIBS) 18 19hoge4: hoge4.o 20 $(CXX) $(CXXFLAGS) -o $@ $< $(LIBS) 21 22%.o: %.c 23 $(CXX) $(CXXFLAGS) -c $< -o $@ $(LIBS) 24 25clean: 26 $(RM) $(TARGET) $(OBJS)

このような感じでmakeをするとちゃんと動作するのですが、

makefile

1CXX = gcc 2TARGET = hoge1 hoge2 hoge3 hoge4 3CXXFLAGS = -Wall -pthread 4LIBS = 5 6OBJS := $(addsuffix .o,$(TARGET)) 7 8all: $(TARGET) 9 10$(TARGET): $(OBJS) 11 $(CXX) $(CXXFLAGS) -o $@ $< $(LIBS) 12 13%.o: %.c 14 $(CXX) $(CXXFLAGS) -c $< -o $@ $(LIBS) 15 16clean: 17 $(RM) $(TARGET) $(OBJS)

こうすると、

makefile

1gcc -Wall -pthread -c hoge1.c -o hoge1.o 2gcc -Wall -pthread -c hoge2.c -o hoge2.o 3gcc -Wall -pthread -c hoge3.c -o hoge3.o 4gcc -Wall -pthread -c hoge4.c -o hoge4.o 5gcc -Wall -pthread -o hoge1 hoge1.o 6gcc -Wall -pthread -o hoge2 hoge1.o 7gcc -Wall -pthread -o hoge3 hoge1.o 8gcc -Wall -pthread -o hoge4 hoge1.o

と、リンク?する際に変数TARGETの先頭のファイルのみの指定となってしまいます。
おそらく、必要なファイル?のところに$(OBJS)とリストで指定しており、
$<を利用しているため先頭のhoge1.oが選択されているのだと思っています。

私的には、ファイル名をターゲットに個別に指定するよりも、変数TARGETに一つ記載しておけば、全部通るMakefileが作りたいと思っています。
何か良い方法はないのでしょうか。ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

foreachを使えばいいのではないでしょうか。

投稿2019/08/02 13:17

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

filu

2019/08/03 07:40

ありがとうございます! 最後のリンク時を define LINK $(1): $(2) $(CXX) $(CXXFLAGS) -o $1 $2 $(LIBS) endef $(foreach VAR, $(TARGET), $(eval $(call LINK, $(VAR),$(addsuffix .o, $(VAR))))) このように、リストから1つずつ引数として渡しすように記述したところ、うまく機能しました! 初歩的な質問で申し訳ありませんでした。 迅速なご回答ありがとうございました!
pepperleaf

2019/08/03 12:04

foreachで無くても簡単にできなかった? 最近、使ってないので、確認できなかったのですが、質問にあるような構文で出来たと思う。 (ただ、手元に環境が無い....) あと、makeは方言があるので注意、、と言っても今は、gnu makeが主流?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問