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

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

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

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

makefile

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

1回答

2277閲覧

g++コンパイラの-MMD -MPの意味を理解したい

退会済みユーザー

退会済みユーザー

総合スコア0

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

makefile

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/08/05 00:07

提示コードの$(CXX) -c -MMD -MP $< -o $@部ですがこの-c -MMD -MPは何をやっていいるのでしょうか?以下のように調べたことをまとめましたが動作が理解出来ません。

わかっていること

ヘッダーとソースファイルがあり変更があった物だけど再コンパイルということはわかるのですがもう少し詳細な順序が知りたいです。

参考サイト

リファレンス:http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC11

-c

意味:コンパイルだけする。 ソース・ファイルのコンパイル、 または、 アセンブルを行いますが、 リンクは行いません。 リンク処理段階は実行されません。 最終的な出力形態は、 個々のソース・ファイルに対応するオブジェクト・ファイルとなります。 デフォルトでは、 ソース・ファイルに対応するオブジェクト・ファイルの名前は、 ソース・ファイル名の接尾語`.c'、 `.i'、 `.s'等を`.o'に置き換えることによって作られます。 接尾語が認識されない入力ファイルは、 コンパイルもアセンブルも必要とされないので、 無視されます。
-MMD
-MD [-M'と似ていますが、 依存関係の情報は、 入力ファイル名の末尾の".c"を".d"に置き換えた名前のファイルに書き込まれます。 指定されたファイルはコンパイルされ、 それに加えて、 このような処理が行われます。 `-MD'は、 `-M'のように通常のコンパイル処理を禁止することをしません。 Machでは、 ユーティリティmdを使うことにより、 複数の依存関係ファイルをマージして、 `make'コマンドで使うのに適した単一の依存関係ファイルを作成することができます。] [`-MD'と似ていますが、 ユーザ・ヘッダ・ファイルだけが対象となり、 システム・ヘッダ・ファイルが省かれる点が違います。]
-P
プリプロセッサに対して、 `#line'指示子を生成しないよう指示します。 `-E'オプションとともに使います。
-M
プリプロセッサに対して、 makeコマンドで使うのに適した、 個々のオブジェクト・ファイルの依存関係を記述したルール情報を出力するよう指示します。 プリプロセッサは、 個々のソース・ファイルに対して、 そのソース・ファイルに対応するオブジェクト・ファイル名が依存関係のターゲットであり、 そのソース・ファイルが#includeにより取り込むすべてのヘッダ・ファイルが依存関係のソースであるようなmakeルールを出力します。(5) このルールは単一行の場合もありますが、 長い場合には、 改行の直前に`\'を置くことにより複数行に継続することもあります。 ルールの一覧は、 前処理されたCプログラムの中にではなく、 標準出力に表示されます。 `-M'は暗黙のうちに`-E'を指定します。 makeルールを出力するよう指定する別の方法に、 環境変数DEPENDENCIES_OUTPUT (GCCに影響を与える環境変数を参照) を設定する方法があります。

Makefile

1File Edit Options Buffers Tools Makefile Help 2PRG :=Converter 3SRC_DIR :=src 4OBJ_DIR :=obj 5DEP_DIR :=obj 6DEP :=$(wildcard $(DEP_DIR)/*.d) 7SRC :=$(wildcard $(SRC_DIR)/*.cpp) 8OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 9 10$(PRG): $(OBJ) 11 $(CXX) $^ -o $@ `Magick++-config --cppflags --cxxflags --ldflags --libs` -lncurses 12 13$(OBJ_DIR)/%.o: src/%.cpp 14 $(CXX) -c -MMD -MP $< -o $@ 15-include $(DEP) 16 17clean: 18 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG)

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

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

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

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

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

guest

回答1

0

投稿2022/08/05 00:17

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2022/08/05 04:10

質問ですが「[`-MD'と似ていますが、 ユーザ・ヘッダ・ファイルだけが対象となり、 システム・ヘッダ・ファイルが省かれる点が違います。]」とありますがユーザーヘッダのみが対象となる利点はなんでしょうか?
y_waiwai

2022/08/05 04:17

その.d のソースファイルのサイズが小さくなる、という利点があります すでに既知であるシステムヘッダのために数百ベージが展開される(それもすべてのファイルで)と言うのはなかなかうざいものになります 実際にそのプションをつけ外しして実際に生成させてみれば違いがわかるかと思います。
退会済みユーザー

退会済みユーザー

2022/08/05 04:23

ありがとうございます。も一つ質問なのですが「-include 」オプションとはここではどんな意味なのでしょうか? また.dファイルは依存関係が書かれたファイルだと思いますがどういった依存関係について書かれているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問