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

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

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

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

Q&A

解決済

1回答

2555閲覧

Makefile入門者 ディレクトリ内のファイルをワイルドカードで指定する方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

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

0グッド

0クリップ

投稿2021/09/13 07:18

###知りたい事
提示コードの二行目のオブジェクトファイル生成部のコードですがターゲットの指定方法が知りたいです。
どうすれば./obj ディレクトリ内に.オブジェクトファイルを生成できるのでしょうか?

###質問内容
参考サイトを参考にワイルドカードの指定を真似ましたがうまく指定できませんこれはどうやったらいいのでしょうか?

###考えたこと
”g++ -l ncurses -o AAEditor” ということで-lの前が空白ということはその前だからつまりオブジェクトファイルのコードが間違えている

参考サイト: https://nao-bamboo.hatenablog.com/entry/2015/09/11/175832

Error

1$ make 2g++ -l ncurses -o AAEditor 3/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start': 4(.text+0x24): undefined reference to `main' 5collect2: error: ld returned 1 exit status 6make: *** [Makefile:11: AAEditor] エラー 1

makefile

1PRG =AAEditor 2SRC =$(wildcard source/*.cpp) $(wildcard header/*.hpp) 3DEP =*.d 4OBJ_DIR =./obj 5OBJ =$(wildcard $(OBJ_DIR)/*.o) 6 7 8 9# 実行ファイル作成 10$(PRG): $(OBJ) 11 $(CXX) $^ -l ncurses -o $@ 12 13 14$(OBJ_DIR)/%.o: $(SRC) 15 $(CXX) -c -MMD -MP $^ 16-include $(DEP) 17 18 19clean: 20 rm -f *.o *.out *.d *.a $(PRG)

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

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

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

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

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

guest

回答1

0

ベストアンサー

参考サイトを参考にしてください。参考サイトではオブジェクトファイルのリストに $(wildcard) は使ってないですよね。

オブジェクトファイルはmake起動時に存在しないことがあるため、ワイルドカードで列挙することはできません。

投稿2021/09/13 13:43

int32_t

総合スコア20884

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

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

退会済みユーザー

退会済みユーザー

2021/09/14 02:14

なるほど以下のようにしたのですがうまく実行できませんこれは何原因なのでしょうか? PRG =AAEditor #SRC =$(wildcard source/*.cpp) $(wildcard header/*.hpp) SRC =source DEP =*.d OBJ_DIR =obj #OBJ =$(wildcard $(OBJ_DIR)/*.o) OBJ := $(addprefix $(OUTDIR)/,$(patsubst source/%.c,%.o,$(SRC))) #OBJ =$(wildcard $(OBJ_DIR)/*.o) # 実行ファイル作成 $(PRG): $(OBJ) $(CXX) $^ -l ncurses -o $@ $(OBJ_DIR)/%.o: source/%.cpp $(CXX) -c -MMD -MP $^ -include $(DEP) clean: rm -f *.o *.out *.d *.a $(PRG)
int32_t

2021/09/14 02:26

「うまく実行できません」とは具体的にどういう症状ですか? 質問者さんの Makefile には OUTDIR という変数は定義されてないですよね。
退会済みユーザー

退会済みユーザー

2021/09/14 02:42

質問ですが ディレクトリ名等を自分の環境に合うように変更して色々ためしたのですが 'obj/source/Scene.o'  つまりオブジェクトファイルがこの位置にはないとうことなのですがどうすれば obj/Scene.oといいった座標に変更できるのでしょうか? 「 $ make make: *** 'tcpserv' に必要なターゲット 'obj/source/Scene.o' を make するルールがありません. 中止 」 PROGNAME := tcpserv INCDIR := SRCDIR := source LIBDIR := lib OUTDIR := obj DEP = %.d TARGET := $(PROGNAME) SRCS := $(wildcard $(SRCDIR)/*.cpp) $(wildcard $(SRCDIR)/$(LIBDIR)/*.cpp) OBJS := $(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(SRCS))) #$(warning $(OBJS)) CC = gcc CFLAGS = -Wall -O2 .PHONY: all clean all: $(TARGET) $(TARGET): $(OBJS) $(CXX) $^ -o $@ $(OUTDIR)/%.o: source/%.cpp @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi $(CXX) -c -MMD -MP $^ -include $(DEP)
int32_t

2021/09/14 03:25

OBJSの中の $(SRCS) を $(notdir $(SRCS)) にするとよいのでは。
退会済みユーザー

退会済みユーザー

2021/09/14 03:35

なるほどオブジェクトファイルの生成には成功したいのですがオブジェクトファイルの生成先が カレントディレクトリになっているのですがなぜ指定できないのでしょうか? $ make g++ -c -MMD -MP source/Fps.cpp g++ -c -MMD -MP source/Scene.cpp g++ -c -MMD -MP source/Entry.cpp g++ -c -MMD -MP source/Main.cpp g++ -c -MMD -MP source/Log.cpp g++ -c -MMD -MP source/Edit.cpp g++ obj/Fps.o obj/Scene.o obj/Entry.o obj/Main.o obj/Log.o obj/Edit.o -o tcpserv g++: error: obj/Fps.o: そのようなファイルやディレクトリはありません g++: error: obj/Scene.o: そのようなファイルやディレクトリはありません g++: error: obj/Entry.o: そのようなファイルやディレクトリはありません g++: error: obj/Main.o: そのようなファイルやディレクトリはありません g++: error: obj/Log.o: そのようなファイルやディレクトリはありません g++: error: obj/Edit.o: そのようなファイルやディレクトリはありません g++: fatal error: no input files compilation terminated. make: *** [Makefile:21: tcpserv] エラー 1
int32_t

2021/09/14 03:45

そりゃあ、この「g++ -c -MMD -MP source/Fps.cpp」というコマンドでは出力先を指定していませんから、カレントディレクトリに出力されますね。 g++ で出力先を指定する方法を調べてみるとよいのでは。
退会済みユーザー

退会済みユーザー

2021/09/14 05:30

質問ですが参考サイト(https://docs.oracle.com/cd/E19957-01/806-4837/Rev.html)より 「 -c コンパイルのみ。オブジェクト .o ファイルを作成しますが、リンクはしません。 この オプションは ld によるリンクを抑止し、各ソースファイルに対する .o ファイルを 1 つずつ生成するように、CC ドライバに指示します。コマンド行にソースファイルを 1 つだけ指定する場合には、-o オプションでそのオブジェクトファイルに明示的に名前を付けることができます。 例 CC -c x.cc と入力すると、x.o というオブジェクトファイルが生成されます。 CC -c x.cc -o y.o と入力すると、y.o というオブジェクトファイルが生成 されます。 」 上記引用よりコマンドを「 $(OUTDIR)/%.o: source/%.cpp @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi $(CXX) $^ -c -MMD -MP $@ -include $(DEP) 」 としたのですが エラー「 $ make g++ source/Fps.cpp -c -MMD -MP obj/Fps.o g++: error: obj/Fps.o: そのようなファイルやディレクトリはありません make: *** [Makefile:25: obj/Fps.o] エラー 1  」が発生するのですがどういう意味なのでしょうか?エラー文の意味がわかりません。 ディレクトリは存在しています。
int32_t

2021/09/14 05:37

> g++ source/Fps.cpp -c -MMD -MP obj/Fps.o 入力のソースファイルを2つ(source/Fps.cpp とobj/Fps.o)指定していて、後者がないというエラーになってますね。 質問者さんが引用した文章の最後の行から付けるべきオプションを読み取れますか?
退会済みユーザー

退会済みユーザー

2021/09/14 05:50

-oをつけ忘れてしました。一度make clean して再度make して実行出来たのですが 質問ですが これはソースファイルが変更されるヘッダーファイルが変更された際もちゃんと再コンパイルする ちゃんとしたmakefileなのでしょうか?実験しましがヘッダーファイルが変更された際もコンパイルされました。
int32_t

2021/09/14 05:56 編集

質問の主題からどんどん離れていっているので、この質問ではもう答えません。 まあ、期待どおり動いているならいいんじゃないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問