🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
make

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

makefile

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

4回答

1115閲覧

[GNU make] ターゲットと依存するファイルとは何か?

退会済みユーザー

退会済みユーザー

総合スコア0

make

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

makefile

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2021/02/07 06:07

提示コードですが。**ターゲットとはなんでしょうか?また依存ファイルとはなんでしょうか?**参考サイトを見たのですが説明少なてつまりなんなのかわかりません。
「「ターゲット」が存在しない,あるいはターゲットよりも新し い「依存するファイル」場合にコマンドが実行されます」
とはどういう意味なのでしょうか?

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

makefile

1main: main.cpp 2 g++ -Wall -c main.cpp 3 g++ -Wall -c header.cpp 4 5 g++ main.o header.o -o Game 6 7clearn: 8 rm -f *.o 9

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

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

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

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

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

guest

回答4

0

ベストアンサー

基本的には下記です。

[最終的に生成されるファイル]: [最終生成物を作る元となるファイル]   [最終的に生成されるファイルを作るためのコマンド群]   [最終的に生成されるファイルを作るためのコマンド群]   [最終的に生成されるファイルを作るためのコマンド群]

なので、提示の Makefile は [最終的に生成されるファイルを作るためのコマンド群] が [最終的に生成されるファイル] (main) を作っていない点がおかしい。

あと、header.cpp が [最終生成物を作る元となるファイル] に入っていないのもおかしい。

さらにいうと、ビルド時に毎回全ファイルのコンパイルとリンクが行われるので時間がかかる。

等々を改善すると下記になります。

Game: main.o header.o g++ main.o header.o -o Game main.o: main.cpp g++ -Wall -c main.cpp header.o: header.cpp g++ -Wall -c header.cpp

これで一度ビルドした後に header.cpp を修正したら、make とすることで必要最小限のコンパイル・リンクだけで済みます (これが make コマンドの存在意義)。

そんなのめんどくさいし時間がかかってもいいからシンプルにいきたい、というなら下記ですね。

Game: g++ -Wall main.cpp header.cpp -o Game

なお、clean のように [最終的に生成されるファイルを作るためのコマンド群] が [最終的に生成されるファイル] (clean) をあえて作らないことで、make clean とすると毎回削除してくれるというターゲットの使い方もあります。

投稿2021/02/07 07:13

68user

総合スコア2022

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

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

0

ターゲットとはなんでしょうか?また依存ファイルとはなんでしょうか?

おおざっぱに、

  • ターゲット: これから作るべきファイル
  • 依存ファイル: ターゲットを作るのに必要なファイル

実行ファイルであるmainmain.cppというソースファイルをコンパイラにコンパイルさせることによって生み出されます。最終的に手にしたいファイルはmainで、main.cppがないとmainは作れません。すなわちmainがターゲットで、main.cppが「依存ファイル」ということです。
フォニーターゲットというのがあるので上記の説明は厳密には正しくないですが、とりあえずはこの認識でいいんじゃないかと思います。

およそまともな入門書がその辺の解説をしていないとは考えられません。ウェブサイトをつまみ食いするのでなく、本屋に行っていろいろ読み比べてみて、助けになりそうな本を2冊ほど買ってくることをお勧めします。

投稿2021/02/07 06:32

KojiDoi

総合スコア13692

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

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

0

main: main.cpp

main というターゲットに対し、依存ファイル(main.cpp)が古ければ、その下のコマンドが実行されます。

ただ、この場合、mainというファイルは(大抵)無いと思われるので、常に実行されます。

また、make の引数で ターゲット指定ができるので、 make cleanとすると、clean: のターゲットが評価されます。(実行されます)

投稿2021/02/07 06:18

pepperleaf

総合スコア6385

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

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

0

ターゲットとは最終的に生成される、目的としたファイル。
この場合は、Game (Windows環境ならGame.exe)
依存ファイルというのは、ターゲットを生成するために必要なファイルのこと。
この場合はmain.cppとかheader.cpp のファイル

投稿2021/02/07 06:16

編集2021/02/07 06:17
y_waiwai

総合スコア88040

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問