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

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

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

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

Q&A

解決済

1回答

459閲覧

[Makefile] $<が使える場面とそうじゃない場面について理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

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

0グッド

0クリップ

投稿2022/08/12 06:02

編集2022/08/12 18:54

提示コードですが以下のコンソールの画面で複数のオブジェクトファイルがlib/objの中にあるのですがなぜかその中の一つしかコマンドに乗らず一つのオブジェクトファイルから静的ライブラリを生成してしまいます。そして以下のように###コメント部の内部を変更すると正常にできたのですがなぜ $<は使えないのでしょうか?参考サイトには依存する最初のファイル名とありますが $(CXX) -c -MMD -MP $< -o $@部では使えいます。これはなぜなのでしょうか?理由が知りたいです

解決方法
ar rcs $@ $(LIB_OBJ)

参考サイト:http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/

Conosle
shigurechan@shigurechan-System-Product-Name:~/Program/test2$ make ar rcs libconsole.a lib/obj/Console.o shigurechan@shigurechan-System-Product-Name:~/Program/test2$

Makefile

makefile

1# ライブラリ 2LIB_DIR :=lib 3LIB_SRC_DIR :=lib/src 4LIB_OBJ_DIR :=lib/obj 5LIB_DEP_DIR :=lib/obj 6LIB_DEP :=$(wildcard $(LIB_DEP_DIR)/*.d) 7LIB_SRC :=$(wildcard $(LIB_SRC_DIR)/*.cpp) 8LIB_OBJ :=$(addprefix $(LIB_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(LIB_SRC)))) $(wildcard $(LIB_OBJ_DIR)/*.o) 9LIB :=libconsole.a # ライブラリ名 10 11# プロジェクト 12SRC_DIR :=src 13OBJ_DIR :=obj 14DEP_DIR :=obj 15DEP :=$(wildcard $(DEP_DIR)/*.d) 16SRC :=$(wildcard $(SRC_DIR)/*.cpp) 17OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 18LIB_PATH :=$(LIB_DIR)/$(LIB) # ライブラリパス 19PRG :=program 20 21# ライブラリ 22$(LIB_OBJ_DIR)/%.o: lib/src/%.cpp 23 $(CXX) -c -MMD -MP $< -o $@ 24-include $(LIB_DEP) 25########################################## 26$(LIB): $(LIB_OBJ) 27 ar rcs $@ $< 28########################################## 29 30# プロジェクト 31$(PRG): $(OBJ) 32 $(CXX) $^ -o $@ $(LIB_PATH) 33 34$(OBJ_DIR)/%.o: src/%.cpp 35 $(CXX) -c -MMD -MP $< -o $@ 36-include $(DEP) 37 38# clean 39clean: 40 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG)

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者が理解していないのは $< ではなく % です。 これがどういう意味だと思っていましたか?

makefile

1$(LIB_OBJ_DIR)/%.o: lib/src/%.cpp

このときの % はワイルドカードであり、このパターンに当て嵌まる依存関係が存在すれば適用するという意味です。

たとえば例としてこのような単純化した場合を考えます。

makefile

1baz.exe : foo.o bar.o 2 gcc $^ -o $@ 3 4%.o : %.c 5 gcc -c $< -o $@ 6 7foo.o : foo.c 8bar.o : bar.c

というように書くと foo.o : foo.c の依存関係と bar.o : bar.c の依存関係が %.o : %.c に当て嵌まりますのでどちらに対しても gcc -c $< -o $@ が実行されます。

同じ内容を多数に適用したいということはよくあるのでこういった仕組みが用意されているのです。

前の質問と状況が同じだとすると lib/src/Console.cpplib/src/Debug.cpp などがパターンに当て嵌まるでしょうから、

makefile

1lib/obj/Console.o: lib/src/Console.cpp 2 $(CXX) -c -MMD -MP $< -o $@ 3 4lib/obj/Debug.o: lib/src/Debug.cpp 5 $(CXX) -c -MMD -MP $< -o $@

といったように書くのと同じことです。 「ひとつづつに分けて処理される」ということです。

機能は連携します。 詰まったときに詰まったところだけ調べてもわかりません。

投稿2022/08/12 09:54

SaitoAtsushi

総合スコア5437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問