Why not register and get more from Qiita? [ Makefile の規則 ] A.基本的な規則. ヘッダのみのライブラリです)私は依存関係をリンクする方法 . project(foo-core VERSION 0.1 LANGUAGES CXX) add_library(foo-core src/foobar/foobar.cc src/foobaz/baz.cc) target_include_directories(foo-core PUBLIC $ $ … これだけだと「ヘッダファイル無いやんけ!」という指摘がくるので、記事を書いた。参考にしてくれ。 順番 関係 自動 標準 循環 原因 依存関係が破棄されました 依存関係 依存 並列 ライブラリ ヘッダファイル ヘッダ パス ディレクトリ makeするルールがありません make dependencies makefile header-files ソース、ヘッダ、オブジェクトファイルは異なる ディレクト リに入れたい. ヘッダ依存関係の自動検出. [][][] GCCの依存関係ファイル出力用のオプション. g++ -c -o foo.o foo.cc Makefileの勉強について 〜 第⑨弾 〜 ##### ヘッダーファイルの依存関係 ##### Makefileを作成する上で注意すべき点として、 "ヘッダファイルの依存関係だけは自分で記述しなければならない" というものがあるらしい。 手っ取り早い方法としては そこで依存関係を自動生成することを考える。 例えば以下のようなディレクトリ構造を考える。 ├makefile ├src/ │├main.c │├sub1.c │└sub2.c └include/ ├header.h ├sub1.h └sub2.h. 循環 - makefile 依存関係 自動 . g++ foo.cc -MM -MP -MF foo.d makefile/Makefile UNIX/Linux及びシェルにおいてmakefileとは、makeコマンドによって実行されることを想定してファイル間の依存関係とタイムスタンプに基づくルールを羅列またはパターンによって記述したテキストファイルです。 makeコマンドとmakefileではmakeコマンドとは何か、makeとgmakeがあ … g++ main.cc -MM -MP -MF main.d g++ -c foo.cc -o foo.o What is going on with this article? rm -f myapp main.o foo.o main.d foo.d, g++ -c -o main.o main.cc Makefile をみればわかりますが、Suffix Rule の場合は foo.h への依存関係がありません。 そのため foo.h が更新されてもコンパイルは実行されません。 % touch foo.h % make -f Makefile.suffix make: `foo ' … Makefileでソース、ヘッダファイルの依存関係を処理 - 余白の書きなぐり 1 user auewe.hatenablog.com コメントを保存する前に 禁止事項と各種制限措置について をご確認ください g++ -o myapp main.o foo.o, Makefile foo.cc foo.d foo.hpp main.cc main.d, g++ foo.cc -MM -MP -MF foo.d Makefile (追加分のみ) main.o: include /hello.h $ make $ ./hello Saluton, Mondo! キリがあっても保守の観点から推奨されません. 実はgccやclangにはMakefile用の便利な機能がある。 ソースファイルを与えるとそれが依存しているソースとヘッダをmakefile形式で列挙してくれるのだ。 例えば、 clang -MM src/test1.cpp と実行すると、 test1.o: src/test1.cpp src/test1_1.h src/test1_2.h `Makefile.in'に加えるとき、その依存関係から全てのシステム特異的な依 存関係が取り除かれる。これは`OMIT_DEPENDENCIES'でファイルを列挙する ことで行われる。 例えば、システムのヘッダ・ファイルへの全ての参照がAutomakeによっ て取り除かれる。 しかし, 実際のプロジェクトにおいて上のように依存関係を逐一記述していたのではキリがありません. Makefile.PLは、Makefileを自動で生成するスクリプトです。XSモジュールを作成すると、自動的にMakefile.PLが作成されています。. GCCには生成するオブジェクトファイルが依存しているファイル(ソースファイルとそこからincludeしているファイル)の情報をMakefileの形式で出力する機能があって、以前も少しメモしている。 GCC 7.2のマニュアルだと 前回、ソースファイルが複数階層に分かれた場合に対応したMakef… 2013-12-18 ソースが複階層化された場合のMakefile(第五回) まだバグ … Makefileの勉強について 〜 第五弾 〜 ##### 依存関係行の応用その 3 ##### ヘッダファイルについて考えてみようの巻 コンパイルしないけど、ソースファイルにインクルードされるファイルってのがある。 それが『ヘッダファイル』と呼ばれるものだったりする。 補足1. メークファイルヘッダの依存関係 (2) 私はmakeを使うのが初めてで、 このチュートリアルを通して基本を学んでいます。 チュートリアルの最終的なmakefileの例を次に示しま … 何があった Makefileのどのソースがそのヘッダに依存するとかの話があっていろいろ苦戦したのでメモ。 そもそも依存関係とは Makefileは、依存関係がズラーっと書いてあって、依存関係の末端にそのファイルの生成方法を書いておく、というのが基本的な考え方です。 Makefileが、変更されたヘッダファイルを含むソースファイルを自動的に再構築するにはどうすればよいですか? Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 ; Gmaj7sus4 2013-11-15 16:32. 強い共感性、深い思考、鋭い五感、溢れる感情と想像力など、hspには他の人が持たない優れた能力がいくつもあります。敏感さを弱点ではなく長所とすることで自分の価値を大きく発揮することができます。 関連記事 2014-02-08 前回のMakefileの補足. しかし、さきほどまでのMakefileにはその依存関係は含まれていない。 ヘッダファイルに関する依存関係を含めた Makefileは次のようになる。 サフィックスルール(.c.o)のところのマクロが、 $^ から $<に変わっていることに注意せよ。 (3) Makeでヘッダファイルの依存関係に対応する 通常はこの記事と同じように -MMD オプションを使ってコンパイルと依存関係ファイル.d の生成を同時に行うことが多いと思われるが、諸事情があり、コンパイルと依存関係ファイルの生成を別々に行いたくなった。� の部分は. Makeは、様々なタイプのファイルのビルド作業を自動的に行ってくれるシンプルかつ強力なツールです。しかしながら、makefileを書く際に問題にぶち当たるプログラマもいれば、Makeの基本知識がないことで、既存のものを再発明してしまうプログラマもいます。 Makefileで、自動生成された.dependをinclude; ところで、.dependもソースやヘッダファイルに依存している。ソースコードに新しく#includeを追加すれば依存関係が変わるのだから当然だろう。 Makefile 別ディレクトリに中間ファイル & 自動依存関係設定 Posted by bosuke on 2013年6月29日 Leave a comment (3) Go to comments 普段、自分でMakefileを書くことはほとんど無い。 includeオプションは,今のmakefileの処理を止めて,指定した別のmakefileの処理を行うというものらしい.上の例では,-include $(DEPS). [][][] GCCの依存関係ファイル出力用のオプション. here Makefile.PLの使い方 - makeからアーカイブ作成まで. 順番 関係 自動 標準 循環 原因 依存関係が破棄されました 依存関係 依存 並列 ライブラリ ヘッダファイル ヘッダ パス ディレクトリ makeするルールがありません make dependencies makefile header-files Makefile は,基本的にはターゲット/依存関係行とコマンド行の組を必要な数だけ並べて構成します.並べる順番は自由です.例えば,先に挙げた main2.c と func2.c から sample3 を生成する手順は: > cc -c main2.c > cc -c func2.c の部分は. そのため、makeは依存関係を記述した"makefile"を読み込み、それにもとづいてコンパイラやリンカを起動します。 開発者は、ファイルの依存関係を記述したmakefileを作成しなければなりません。makefileの基本的な記述方法は、以下のとおりです。 ここで各ソースファイルの依存関係は以下のようだとする。 何があった Makefileのどのソースがそのヘッダに依存するとかの話があっていろいろ苦戦したのでメモ。 そもそも依存関係とは Makefileは、依存関係がズラーっと書いてあって、依存関係の末端にそのファイルの生成方法を書いておく、というのが基本的な考え方です。 メークファイルヘッダの依存関係 (2) 私はmakeを使うのが初めてで、 このチュートリアルを通して基本を学んでいます。 チュートリアルの最終的なmakefileの例を次に示しま … 前回はMakefileをヘッダファイルの依存関係に対応させてみた。 そのMakefileは入力ファイル(ソース、ヘッダ)と出力ファイル(依存関係ファイル(.d)、オブジェクトファイル、実行ファイル)がすべて同じディレクトリにあることが前提となっていた。. Tweet. (C/C++で) (6) @mipadiが言ったこと以上に、依存関係のレコードを生成するために ' -M 'オプションの使用法を探ることもできます。 makefileはソースやオブジェクトなどのファイルの依存関係と更新日付で適切なアクションを取るのですがファイルを書き換えてうまくいったなら「どこかに更新日付が不適切になっていてそれがたまたま解消されたから」といった原因かも知れません。 C や C++ で書かれたプログラムのビルドの際、Make でヘッダファイルの依存関係に対応するには、gcc の -MMD オプションを組み合わせればよいことが知られている。 1. Makefileでソース、ヘッダファイルの依存関係を処理 . g++ -o myapp main.o foo.o, Makefile foo.cc foo.hpp foo.o main.cc main.o myapp, MacBook AirとApple Watchをプレゼント!業務をハックするTips募集中, GNU Make は include 先が見つからなくてもルールさえあれば生成して include してくれる, Makefile pattern rule with two or more dependencies %.sas7bdat: %.sas %.dat, make -n (dry-run) の際には依存関係ファイル .d は生成されないようにする, you can read useful information later efficiently. Makefileを作成する上で注意すべき点として、 "ヘッダファイルの依存関係だけは自分で記述しなければならない" というものがあるらしい。 手っ取り早い方法としては 『[C++][Makefile] 『依存関係行の応用その 3』をやってみた』で記載したように、 背景 C/C++用のMakefileを書いていると,依存関係を記述するのがなかなか厄介に感じられる. 何とか自動的に依存関係を定義したいと考えた. gcc/g++による依存関係の抽出 gcc/g++は以下のようにして依存関係を抽出することが可能である. $ g++ -MM foo.cpp foo.o: foo.cpp … CやC++で書かれたプログラムをMakeを使ってビルドする、というのはUnix/Linuxではよく行われていることだが、ちゃんとしたMakefileを書くのは意外と難しい。, しかし、このMakefileには欠陥がある。例えばmyappができた状態で、関数fooの仕様を変更して引数を追加したとする。, main.cにある関数fooの呼び出し部分も当然変更する必要があるが、それを忘れてmakeを実行したとしよう。, このようにfoo.cのみがコンパイルされ、myappが作られる。main.oは古いままだ。なぜならMakefileに記述された依存関係によればmain.oが依存しているのはmain.cのみであり、main.cは書き換えられていないからだ。main.cにあるfooの呼び出しは引数1個のであり、呼ばれた側は2個目の引数も使うことになってしまう。実際、実行すると以下のようにおかしな値が出てくる。, こうなってしまった原因は、Makefileに書かれた依存関係が実際の依存関係を反映できていないためだ。main.cはfoo.hをインクルードしている以上、foo.hが変更されたら再コンパイルされるべきである。つまり、main.oはmain.cだけでなくfoo.hにも依存している。しかしMakefileではそれが表現されていない。そこで、Makefileにヘッダファイルの依存関係を書く方法を考えよう。, もっともシンプルな方法は手動で書くことだ。Makefileに以下の行を追加しよう。, これで実行すれば以下のようにmain.cがコンパイルされ、エラーを検出することができる。, もちろんこんなやり方はすぐに破綻する。すべてのcファイルに対して依存関係を手動で書かなければならないからだ。もう少し良い方法を考えよう。, あるcファイルが依存するヘッダファイルを知るにはどうしたらよいか?もちろん#includeを追えばよいわけで、単純なケースならgrepでも使えば分かるだろう。しかしこれは中々に面倒な作業だ。インクルードされたヘッダファイルがインクルードしているものも追いかけなければならないし、include文に見えるものが実はコメントアウトされているかもしれない。さらに、#ifdefによる条件分岐の対応や、ヘッダファイルの実際の場所を知るにはコンパイラのオプション(-Dや-I)を知る必要があり、ソースファイルの解析だけではそもそも不可能だ。, しかし、自力でこのようなことをやらなくても、cファイルがインクルードするヘッダファイルを知っている者がいる。それはコンパイラだ。そして嬉しいことにgccはこの情報を表示するオプションを提供してくれている。-Mから始まるオプションがそれだが、いくつか種類があるためまずはそれらの使い方を覚えよう。, 随分とたくさんのファイルが出てきたが、これらはstdio.hからインクルードされているものである。, なお-Mと-MMの違いは、gcc-3.0以降で仕様が変更されている。gcc-3.0以前の-MMオプションは、#include "xxx.h" のようにダブルクオートで囲まれたもののみを対象にし、#include のように'<>'で囲まれたものは対象にしない、というものだった。, 依存するヘッダファイルを偽のターゲットとして追加する。foo.cに対して-MPなし、ありで実行した結果は以下のようになる。, では実際にやってみよう。まずは-MMDを使って.cファイルの依存関係を.dファイルに出力するようにする。-MDでも良いが、/usr/includeや/usr/local/includeにあるようなヘッダに対して非互換のアップデートが行われることはあまりないので-MMDを使う。もちろん変更が多いような環境であれば-MDを使おう。前述のとおり、-MMDではコンパイルも同時に行われる。また、変数DEPSに.dファイルの一覧が入るようにする。, 今後makeを実行するときはmain.d、foo.dが読み込まれればよい。そのためにinclude文を使う。以下の行を all: のある行より下に追加しよう。all: より上にあるとデフォルトのターゲットが変わってしまう。また、includeの頭に'-'を付けているので.dファイルがなくてもエラーにはならない。こうしておかないと最初の実行時(このときは当然.dファイルはない)にエラーになってしまう。, では実際に試してみよう。一度ビルドして、その後foo.hを変更してからもう一度ビルドする。なお、touchコマンドは空ファイルを作るのによく使われるが、既存のファイルを指定すると内容を変えずに更新時刻を現在時刻にする。これにより、foo.hが変更されたとMakeがみなすようになる。Makeの勉強をするときはtouchコマンドが便利なので覚えておこう。, このように、foo.hをインクルードしているmain.c、foo.cも再コンパイルされている。, このMakefileには実はちょっとした欠陥がある。ヘッダファイルの削除があるとエラーになってしまうのだ。例えばmain.cが関数fooを使わないようになり、そのためfoo.cおよびfoo.hが削除されたとしよう。その状態でmakeを実行すると以下のようになる。, ここで-MPオプションの意味が分かるようになる。あらかじめ-MPを付けておけばmain.dは, となる。foo.hが空のターゲットとなるため、foo.hがなくなってもエラーにはならない。, 以上でヘッダファイルの依存関係の対応ができた。しかし、このMakefileにはまだ欠点がある。この辺はまたそのうちやろうと思う。, 上記のMakefileでは.oや.dをカレントディレクトリに出力するが、生成物は別のディレクトリにしたいこともある。例えばVisual Studioのように、デバッグ版はDebugに、リリース版はRelease以下に出力するような場合だ。大したことのないように思えるが、ディレクトリが複数になると依存関係を正しく記述するのが意外のほど面倒になる。, プログラムを書くとき、どのくらいの頻度でコンパイルを行うかは人それぞれだと思うが、完成と思うものができるまで一切コンパイルしないという人は少数派だと思う。ある程度書いた段階でとりあえずビルドして文法的な間違いがないかをチェックする人も多いだろう。, このとき、リンクまでやってしまうと大きなプログラムでは時間がかかるため、コンパイルのみ行うようにすると便利だ。Visual C++では指定したソースファイルのコンパイルのみ行うことができる(Ctrl-F7)。これを使うと短時間で文法のチェックができる。, しかしこのMakefileでは`make foo.o`のようにfoo.cだけをコンパイルするようにした場合でもmain.dまで読んでしまう。それどころか make clean のときも.dファイルを読み込む。.cファイルの数が増えるとそれだけで時間がかかってしまう。場合によっては.dファイルの探索と読み込みだけで10秒くらいかかることもある。, wagavulinさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog Makefile における依存関係の例 : sub1.o: sub1.c ← 依存関係: 「sub1.o が sub1.c に依存している」 cc -c sub1.c ← 生成コマンド: sub1.c から sub1.o を生成する 詳しくは 依存関係の書き方参照。 ターゲット 「あるファイル」を生成したい。 make C. 大規模な C言語 プログラムでは、ソースやヘッダファイルが複雑な依存関係を持つため、それらを自動解決してくれる Makefile が欲しくなる。. Makefileを書いたのでここにメモしておきます。 参考にしたのはこちらのサイトです。 シンプルで応用の効くmakefileとその解説 - URIN HACK [Bash] ファイルやディレクトリの存在をチェックする方法 Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 GNU make 日… そのため、makeは依存関係を記述した"makefile"を読み込み、それにもとづいてコンパイラやリンカを起動します。 開発者は、ファイルの依存関係を記述したmakefileを作成しなければなりません。makefileの基本的な記述方法は、以下のとおりです。 c++ - 書き方 - makefile 依存 関係 include Makefile:ヘッダファイルとそのディレクトリを正しくインクルードするには? ブログを報告する, CMakeを使うと、CMakeCache.txtやCMakeFilesなど様々ななファイ…, CMakeを使ってみた (7) find_packageとpkg_check_modulesによるラ…, CMakeを使ってみた (7) find_packageとpkg_check_modulesによるライブラリ探索, Mは指定されたcファイルがインクルードするヘッダファイルを調べ、オブジェクトファイルの依存関係として表示する。前述のfoo.cに対して実行すると以下のようになる。, Mと同様だが、システムヘッダディレクトリにあるものは除外される。foo.cに対しては以下のようになり、stdio.hやその先のファイルは表示されなくなる。, Mや-MMは結果を標準出力に出力したが、-MFを付けると結果を指定したファイルに保存するようになる。, Mや-MMは通常インクルード対象のヘッダファイルが見つからないとエラーを出力するが、-MGを追加するとエラーとしなくなる。ヘッダファイルが自動生成されるようなケースで使うらしい。, Mや-MMは依存するインクルードファイルを調べるのみでありコンパイルは行わないが、-MDを使うとコンパイルも行われる。-MDを使ったときは-MFを使わなくても結果はファイル(ソースファイルの拡張子を.dにしたもの)に保存される。もちろん-MFでファイル名を指定することもできる。. Makefile から sub/Makefile に書かれた make hoge を実行するには cd sub && $(MAKE) hoge "CC=$(CC)" 外部ファイル hoge を読み込むには -include hoge; ヘッダファイル. Makefile でのヘッダファイルの依存関係を自動的に解決する Makefile でヘッダファイルの依存関係を書くのは結構面倒である。 以前は X に付属の makedepend コマンドを使って行うのが普通だったが、便利な方法がないか調べてみた。 こうなってしまった原因は、Makefileに書かれた依存関係が実際の依存関係を反映できていないためだ。main.cはfoo.hをインクルードしている以上、foo.hが変更されたら再コンパイルされるべきである。つまり、main.oはmain.cだけでなくfoo.hにも依存している。しかしMakefileではそれが表現されていない。そこで、Makefileにヘッダファイルの依存関係を書く方法を考えよう。 GCCには生成するオブジェクトファイルが依存しているファイル(ソースファイルとそこからincludeしているファイル)の情報をMakefileの形式で出力する機能があって、以前も少しメモしている。 GCC 7.2のマニュアルだと 追記: (2015/8/3) 大量のはてブが付いたので 続き を書きました… 2013-12-25 quickrunで部分コンパイル … includeオプションは,今のmakefileの処理を止めて,指定した別のmakefileの処理を行うというものらしい.上の例では,-include $(DEPS). | 図中のファイルMakefile-CONF.mkは、Makefile-Release.mk、Makefile-Debug.mkなどの、すべてのプロジェクト構成のための複数のファイルを表しています。 管理対象プロジェクトの場合、IDE自体がすべてのmakefileを生成し、依存性チェックの適切な手順を挿入します。 この記事の内容は古くなっています。 Makefileを自動生成する試み2012 をどうぞ久々に、というか初めて本格的にC++を使ってプログラムを書いているのだが、Makefileを書くのが面倒で仕方ない。C++で依存関係といえば#include。つまり#include行を取り出してMakefileにぶち込むスクリプトを… 大規模なC言語プログラムでは、ソースやヘッダファイルが複雑な… 2014-04-14 シェルスクリプトの平文パスワードをセキュアにする方法. g++ -c main.cc -o main.o Makefileを書いたのでここにメモしておきます。 参考にしたのはこちらのサイトです。 シンプルで応用の効くmakefileとその解説 - URIN HACK [Bash] ファイルやディレクトリの存在をチェックする方法 Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 GNU make 日… この依存関係ファイルはmakefile最後のinclude文にてインクルードされることで依存しているヘッダファイル等が変更された場合に自動的に再コンパイルされるようになる。 リンクオプション (LDFLAGS) リンクオプションとしてLDFLAGSの値を用いる。初期値は空。 Makefileと呼ばれるテキストファイルに必要なファイルと各ファイルのコンパイルのコマンド、ファイル間の依存関係を記します。そして、“make”というコマンドを実行するだけで、自動的にコマンドを実行してコンパイルしてくれます。これだけではスクリプトと大差がないのですが、makeは Makefileを作成する上で注意すべき点として、 "ヘッダファイルの依存関係だけは自分で記述しなければならない" というものがあるらしい。 手っ取り早い方法としては 『[C++][Makefile] 『依存関係行の応用その 3』をやってみた』で記載したように、 … GNU Make用のMakefileに以下のような記述を加えることで,オブジェクトファイル(.o)が依存するソースファイル(.c, .cpp)とヘッダファイル(.h, .hpp)依存関係を自動的に定義することができる. あとは,実行ファイルとオブジェクトファイル間の依存関係を定義するだけでよい. Makeでヘッダファイルの依存関係に対応する 通常はこの記事と同じように -MMD オプションを使ってコンパイルと依存関係ファイル .d の生成を同時に行うことが多いと思われるが、諸事情があり、コンパイルと依存関係ファイルの生成を別々に行いたくなった。簡単そうに見えるが、妙なところでハマった。 Makefileでソース、ヘッダファイルの依存関係を処理. ですから makefile に依存関係を記述すれば正しく更新されます. g++ main.cc -MM -MP -MF main.d 欲望を具体化すると. 広告を非表示にする. By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. C や C++ で書かれたプログラムのビルドの際、Make でヘッダファイルの依存関係に対応するには、gcc の -MMD オプションを組み合わせればよいことが知られている。, 通常はこの記事と同じように -MMD オプションを使ってコンパイルと依存関係ファイル .d の生成を同時に行うことが多いと思われるが、諸事情があり、コンパイルと依存関係ファイルの生成を別々に行いたくなった。簡単そうに見えるが、妙なところでハマった。, このような Makefile を作れば期待通りの動作を実現できた。GNU Make 3.81 で確認。, 「期待通りの動作」とは、ハマりどころの裏返しでもあるのだが、主に以下の2点がポイントである。, 1点目のポイントは、依存関係ファイル .d とオブジェクトファイル .o の生成ルールを以下のように「静的パターンルール」で書くことである。, 2点目のポイントは、依存関係ファイル .d を -include 文に頼らずに以下のように書いてインクルードすることである。, まず、最初に紹介した記事にならって、コンパイルと依存関係ファイルの生成を同時に行う Makefile を作ると以下のようになる。主要部分のみ抜粋。, さて、これでよいはずだと思ったが、念のためきちんと動くか dry-run で確認する。, おかしい。実行される予定のコマンド列は正しいのだが、依存関係ファイル foo.d, main.d が実際に生成されてしまっている。ビルド自体は何ら問題なく実行できるため、気にしなければよいと言われればそれまでなのだが…。, make clean に至ってはわざわざ依存関係ファイルを生成してから削除している。生成を要求していないのに…? 誰かが生成を要求している…?? 一体誰が…???, この記事で解説されている通り、いわゆる sub-Makefile を自動生成するルールが定義されていれば、include 文自体が当該 sub-Makefile の要求者となってくれる。, ところがこの sub-Makefile 自動要求は dry-run の対象外のようで、dry-run であろうとなかろうと sub-Makefile が生成されてしまう。よくよく考えれば一理あり、sub-Makefile がなければ Makefile 全体が完成しないのだから、これは当然の挙動とも思える。今回は include 文ではなく -include 文を使っているのだから、ファイルが存在しなければ無視してほしいものだが…。, とりあえずの回避策としては、自前で明示的に「存在するファイルだけインクルードする」ように書く方法がある。, さてこれで解決かと思いきや、もうひとつ落とし穴が存在した。この時点では Makefile の主要部分は以下のようになっている。, おかしい。依存関係ファイルが生成されていない。よく見るとコンパイルする際の引数の順番が Makefile で定義したものと異なっており、デフォルトのサフィックスルールが走っているように見える。Makefile で定義したルールはどこへ行ったのか?, この記事の回答者の解説によると、「暗黙パターンルール」では依存するファイル(コロンより右側)が存在しない場合、そのルールは実行候補から除外されてしまうらしい。今回の場合は、main.d や foo.d が(最初の時点では)存在しないため、せっかく定義したルールが実行候補から外れてしまっているのである。, 解決策は、暗黙パターンルールを静的パターンルールに書き換えることである。見た目は似ているが、静的パターンルールの場合は、存在しないファイルに依存しているようになっていると、その依存ファイルを生成する別なルールがないか探してくれるようだ。, ちなみに静的パターンルールは、1行の中にコロンが2回出てきてよくわからないかもしれないが、例えば ${DEPS}: %.d: %.cc の場合は、${DEPS} に対して for-each で %.d: %.cc が定義されていると思えばよい。. ここでは、Makefile.PLの基本的な使い方を解説します。 Makefileの依存関係の記述を自動化する簡単な方法 ビルドにmakeコマンドを使うときにはMakefileにファイルの依存関係を書いておく必要があります。 しかし、開発の途中でインクルードするヘッダファイルが増えてくると、これらの依存関係を手作業で記述するのは面倒です。 循環 - makefile 依存関係 自動 . Help us understand the problem. -MMオプションを用いてMakefileでヘッダファイルの依存を扱います。 $ cc -MM -I./include sample.c sample.o: sample.c include/sample.h 3 依存関係を記述した%.dファイル 補足1.