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

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

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

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Q&A

解決済

2回答

1151閲覧

mkefileが正しく記述されていないことが原因でメモリエラーが正しく検出されない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

0グッド

0クリップ

投稿2021/09/15 13:45

編集2021/09/16 00:25

提示コードですが以前の参考サイト部でmakeを実行すると普通にコンパイルが通りアプリを実行するとその問題のコードに達するとエラー提示画像のエラーが発生して。makeをクリーンしてmakeすると以下ようなエラーが出ますつまりmakefileが正しく記述されていないことが原因なのですがこれは何が原因なのでしょうか?
DEPファイルの何が悪いのでしょうか?
イメージ説明

以前の質問 https://teratail.com/questions/359488

$ make g++ -c -MMD -MP source/Edit.cpp -o obj/Edit.o In file included from /usr/include/c++/9/memory:80, from source/../header/Edit.hpp:5, from source/Edit.cpp:5: /usr/include/c++/9/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Screen]’: /usr/include/c++/9/bits/unique_ptr.h:292:17: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Screen; _Dp = std::default_delete<Screen>]’ source/Edit.cpp:9:22: required from here /usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incomplete type ‘Screen’ 79 | static_assert(sizeof(_Tp)>0, | ^~~~~~~~~~~ make: *** [Makefile:11: obj/Edit.o] エラー 1

makefile

1PRG :=AAEditor 2SRCDIR :=source 3OUTDIR :=obj 4DEP :=obj/%.d 5SRC :=$(wildcard $(SRCDIR)/*.cpp) 6OBJ :=$(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 7$(PRG): $(OBJ) 8 $(CXX) $^ -l ncurses -o $@ 9 10$(OUTDIR)/%.o: source/%.cpp 11 $(CXX) -c -MMD -MP $^ -o $@ 12-include $(DEP) 13 14clean: 15 rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG) 16

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

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

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

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

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

int32_t

2021/09/15 14:01

現在の質問文では前の質問と聞いていることが同じですよ。原因はもうわかっているはずですよね。 知りたいのは DEP の何がおかしいのか、どう対処するのか、では?
K_3578

2021/09/16 00:16

なぜteratailタグを付けたんです?関係ないならノイズなので外してください。
guest

回答2

0

ベストアンサー

make --debug=m で起動すると、「obj/%.d というファイルがない」というメッセージが出ると思います。

Makefile

1DEP :=obj/%.d 2 3-include $(DEP)

これは、「obj/%.d というファイルをここに取り込め」という意味です。%.d なんていうファイルはないでしょうから、効果のない記述になっています。
includeパターンルール${patsubst}% は使えません。

DEP の定義も、OBJ 変数の定義でやっているように SRC を変形してあげるか、OBJ を変形してやればよいでしょう。

投稿2021/09/15 15:24

編集2021/09/15 15:27
int32_t

総合スコア20882

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

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

退会済みユーザー

退会済みユーザー

2021/09/15 23:31 編集

なるほど、こうしましたがこれは正しいのでしょうか?エラーが再現できないので質問しました PRG :=AAEditor SRCDIR :=source OUTDIR :=obj DEPDIR :=obj DEP :=$(addprefix $(DEODIR)/,$(patsubst %.o,%.d,$(notdir $(OBJDIR)))) SRC :=$(wildcard $(SRCDIR)/*.cpp) OBJ :=$(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) $(PRG): $(OBJ) $(CXX) $^ -l ncurses -o $@ $(OUTDIR)/%.o: source/%.cpp $(CXX) -c -MMD -MP $^ -o $@ -include $(DEP) clean: rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG)
int32_t

2021/09/15 23:37

正しくないですね。 make --debug=m は試してみましたか? ${warning ${DEP}) で DEP の中身が「obj/なんとか.d obj/なんとか.d ...」になっているか確認しましたか?
退会済みユーザー

退会済みユーザー

2021/09/15 23:41

はい。一度クリーンして確認したのですがこういったことが表示されました。二回目はたんにgnu make について表示されるだけでした。 $ make --debug=m GNU Make 4.2.1 このプログラムは x86_64-pc-linux-gnu 用にビルドされました Copyright (C) 1988-2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> これはフリーソフトウェアです: 自由に変更および配布できます. 法律の許す限り、 無保証 です. makefile を読み込みます... makefile の更新中.... 最終ターゲットを更新中.... ファイル 'AAEditor' が存在しません. ファイル 'obj/Fps.o' が存在しません. ターゲット 'obj/Fps.o' を再make する必要があります. 省略 ターゲット 'obj/Edit.o' を再make する必要があります. g++ -c -MMD -MP source/Edit.cpp -o obj/Edit.o ターゲットファイル 'obj/Edit.o' の再 make に成功しました. ターゲット 'AAEditor' を再make する必要があります. g++ obj/Fps.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o -l ncurses -o AAEditor ターゲットファイル 'AAEditor' の再 make に成功しました.
退会済みユーザー

退会済みユーザー

2021/09/15 23:42

またスペルミスを修正しました PRG :=AAEditor SRCDIR :=source OUTDIR :=obj DEPDIR :=obj DEP :=$(addprefix $(DEPDIR)/,$(patsubst %.o,%.d,$(notdir $(OUTDIR)))) SRC :=$(wildcard $(SRCDIR)/*.cpp) OBJ :=$(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) $(PRG): $(OBJ) $(CXX) $^ -l ncurses -o $@ $(OUTDIR)/%.o: source/%.cpp $(CXX) -c -MMD -MP $^ -o $@ -include $(DEP) clean: rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG)
int32_t

2021/09/15 23:46

> 省略 省略してはいけません。「ファイル 'obj/obj' が存在しません.」のようなメッセージが出ていませんか。最新の Makefile だと、DEP の中身が「obj/obj」になると思います。
退会済みユーザー

退会済みユーザー

2021/09/15 23:53

$ make --debug=m GNU Make 4.2.1 このプログラムは x86_64-pc-linux-gnu 用にビルドされました Copyright (C) 1988-2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> これはフリーソフトウェアです: 自由に変更および配布できます. 法律の許す限り、 無保証 です. makefile を読み込みます... makefile の更新中.... ファイル 'obj/obj' が存在しません. ターゲット 'obj/obj' を再make する必要があります. ターゲットファイル 'obj/obj' の再make に失敗しました. 最終ターゲットを更新中.... make: 'AAEditor' は更新済みです.         と表示されため以下のように修正したら治りましたが正解でしょうか? PRG :=AAEditor SRCDIR :=source OBJDIR :=obj DEPDIR :=$(wildcard $(OBJDIR)/*.d) DEP :=$(addprefix $(OBJDIR)/,$(patsubst %.o,%.d,$(notdir $(DEPDIR)))) SRC :=$(wildcard $(SRCDIR)/*.cpp) OBJ :=$(addprefix $(OBJDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) $(PRG): $(OBJ) $(CXX) $^ -l ncurses -o $@ $(OBJDIR)/%.o: source/%.cpp $(CXX) -c -MMD -MP $^ -o $@ -include $(DEP) clean: rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG)
int32_t

2021/09/16 00:23

> 正解でしょうか? たまたま結果的にDEPの中身は間違ってはいないですが、書いてあることはむちゃくちゃですね! > DEPDIR :=$(wildcard $(OBJDIR)/*.d) DEPDIRに、存在する obj/*.d のファイル名のリストが入ります。 DIRと付いている変数にディレクトリ名ではなくファイルのリストを入れるのはおかしいです。 > $(notdir $(DEPDIR)) ディレクトリ名が削られて、「Edit.d Sceen.d ...」のようなリストになります。 > ${patsubst %.cpp,%.o,...) *.cpp というファイル名を %.o に置き換えます。リストに *.cpp は含まれないので何も起きず、結果はまだ「Edit.d Screen.d ...」のようなリストです。 > $(addprefix $(OBJDIR)/, ...) $(OBJDIR) が個々のファイルに足されて、「obj/Edit.d obj/Screen.d ...」のようなリストに戻ります。これは DEPDIR と同じです。 要するに、「DEP := $(wildcard $(OBJDIR)/*.d) 」で構いません。 OBJから作るなら $(patsubst %.o,%.d,...) だけでいいですし、SRC から作るなら OBJ の定義をコピーして %.o を %.d にすればよいです。
退会済みユーザー

退会済みユーザー

2021/09/16 06:34

なるほど。再度make --debug=m コマンドを使って調べてみましたがこいったエラーがでました。 Color.oファイルが作られていないことが原因なのですがなぜ作られないのでしょうか? PRG :=AAEditor SRCDIR :=source OBJDIR :=obj DEPDIR :=obj DEP :=$(wildcard $(DEPDIR)/*.d) SRC :=$(wildcard $(SRCDIR)/*.cpp) OBJ :=$(addprefix $(OBJDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) $(PRG): $(OBJ) $(CXX) $^ -l ncurses -o $@ $(OBJDIR)/%.o: source/%.cpp $(CXX) -c -MMD -MP $^ -o $@ -include $(DEP) clean: rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG) 下記makeファイル実行 $ make --debug=m GNU Make 4.2.1 このプログラムは x86_64-pc-linux-gnu 用にビルドされました Copyright (C) 1988-2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> これはフリーソフトウェアです: 自由に変更および配布できます. 法律の許す限り、 無保証 です. makefile を読み込みます... makefile の更新中.... 最終ターゲットを更新中.... ファイル 'AAEditor' が存在しません. ターゲット 'AAEditor' を再make する必要があります. g++ obj/Fps.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o -l ncurses -o AAEditor /usr/bin/ld: obj/Main.o: in function `main': Main.cpp:(.text+0x62): undefined reference to `InitColorPairs()' /usr/bin/ld: obj/Screen.o: in function `Screen::Screen()': Screen.cpp:(.text+0x1cc): undefined reference to `GetColorNum(int, int)' /usr/bin/ld: obj/Screen.o: in function `Screen::UpdateScreen()': Screen.cpp:(.text+0x331): undefined reference to `GetColorNum(int, int)' /usr/bin/ld: obj/Screen.o: in function `Screen::Delete(int, int)': Screen.cpp:(.text+0x47b): undefined reference to `GetColorNum(int, int)' /usr/bin/ld: obj/Edit.o: in function `Edit::KeyInput()': Edit.cpp:(.text+0x1bc): undefined reference to `GetColorNum(int, int)' /usr/bin/ld: obj/Edit.o: in function `Edit::MouseInput()': Edit.cpp:(.text+0x348): undefined reference to `GetColorNum(int, int)' /usr/bin/ld: obj/Edit.o:Edit.cpp:(.text+0x3f6): more undefined references to `GetColorNum(int, int)' follow collect2: error: ld returned 1 exit status make: *** [Makefile:9: AAEditor] エラー 1
int32_t

2021/09/16 06:41 編集

DEPの問題(この質問)と Color.o ができない問題は関係ないと思いますよ。
guest

0

たんにmakefileの不備で、生成される実行ファイルが、最新のビルド結果となってないだけでしょう
クリーンすると、全ソースコードがコンパイル/ビルドされるので、最新の結果となります

投稿2021/09/15 13:50

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2021/09/15 15:01

それはわかるのですが。makefileのどう間違えているのでかをしりたいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問