makefile 依存関係 ヘッダ

Tweet. -MMオプションを用いてMakefileでヘッダファイルの依存を扱います。 $ cc -MM -I./include sample.c sample.o: sample.c include/sample.h 3 依存関係を記述した%.dファイル includeオプションは,今のmakefileの処理を止めて,指定した別のmakefileの処理を行うというものらしい.上の例では,-include $(DEPS). 補足1. 何があった Makefileのどのソースがそのヘッダに依存するとかの話があっていろいろ苦戦したのでメモ。 そもそも依存関係とは Makefileは、依存関係がズラーっと書いてあって、依存関係の末端にそのファイルの生成方法を書いておく、というのが基本的な考え方です。 Makefileの勉強について 〜 第⑨弾 〜 ##### ヘッダーファイルの依存関係 ##### Makefileを作成する上で注意すべき点として、 "ヘッダファイルの依存関係だけは自分で記述しなければならない" というものがあるらしい。 手っ取り早い方法としては Makefileを書いたのでここにメモしておきます。 参考にしたのはこちらのサイトです。 シンプルで応用の効くmakefileとその解説 - URIN HACK [Bash] ファイルやディレクトリの存在をチェックする方法 Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 GNU make 日… 関連記事 2014-02-08 前回のMakefileの補足. `Makefile.in'に加えるとき、その依存関係から全てのシステム特異的な依 存関係が取り除かれる。これは`OMIT_DEPENDENCIES'でファイルを列挙する ことで行われる。 例えば、システムのヘッダ・ファイルへの全ての参照がAutomakeによっ て取り除かれる。 c++ - 書き方 - makefile 依存 関係 include Makefile:ヘッダファイルとそのディレクトリを正しくインクルードするには? 広告を非表示にする. Makefile でのヘッダファイルの依存関係を自動的に解決する Makefile でヘッダファイルの依存関係を書くのは結構面倒である。 以前は X に付属の makedepend コマンドを使って行うのが普通だったが、便利な方法がないか調べてみた。 ブログを報告する, 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 における依存関係の例 : sub1.o: sub1.c ← 依存関係: 「sub1.o が sub1.c に依存している」 cc -c sub1.c ← 生成コマンド: sub1.c から sub1.o を生成する 詳しくは 依存関係の書き方参照。 ターゲット 「あるファイル」を生成したい。 Why not register and get more from Qiita? キリがあっても保守の観点から推奨されません. GCCには生成するオブジェクトファイルが依存しているファイル(ソースファイルとそこからincludeしているファイル)の情報をMakefileの形式で出力する機能があって、以前も少しメモしている。 GCC 7.2のマニュアルだと Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 ; Gmaj7sus4 2013-11-15 16:32. 欲望を具体化すると. Makefileでソース、ヘッダファイルの依存関係を処理 - 余白の書きなぐり 1 user auewe.hatenablog.com コメントを保存する前に 禁止事項と各種制限措置について をご確認ください Makeは、様々なタイプのファイルのビルド作業を自動的に行ってくれるシンプルかつ強力なツールです。しかしながら、makefileを書く際に問題にぶち当たるプログラマもいれば、Makeの基本知識がないことで、既存のものを再発明してしまうプログラマもいます。 ここでは、Makefile.PLの基本的な使い方を解説します。 この記事の内容は古くなっています。 Makefileを自動生成する試み2012 をどうぞ久々に、というか初めて本格的にC++を使ってプログラムを書いているのだが、Makefileを書くのが面倒で仕方ない。C++で依存関係といえば#include。つまり#include行を取り出してMakefileにぶち込むスクリプトを… C や C++ で書かれたプログラムのビルドの際、Make でヘッダファイルの依存関係に対応するには、gcc の -MMD オプションを組み合わせればよいことが知られている。 1. 順番 関係 自動 標準 循環 原因 依存関係が破棄されました 依存関係 依存 並列 ライブラリ ヘッダファイル ヘッダ パス ディレクトリ makeするルールがありません make dependencies makefile header-files そのため、makeは依存関係を記述した"makefile"を読み込み、それにもとづいてコンパイラやリンカを起動します。 開発者は、ファイルの依存関係を記述したmakefileを作成しなければなりません。makefileの基本的な記述方法は、以下のとおりです。 強い共感性、深い思考、鋭い五感、溢れる感情と想像力など、hspには他の人が持たない優れた能力がいくつもあります。敏感さを弱点ではなく長所とすることで自分の価値を大きく発揮することができます。 Makefileを作成する上で注意すべき点として、 "ヘッダファイルの依存関係だけは自分で記述しなければならない" というものがあるらしい。 手っ取り早い方法としては 『[C++][Makefile] 『依存関係行の応用その 3』をやってみた』で記載したように、 Help us understand the problem. rm -f myapp main.o foo.o main.d foo.d, g++ -c -o main.o main.cc Makefileが、変更されたヘッダファイルを含むソースファイルを自動的に再構築するにはどうすればよいですか? しかし、さきほどまでのMakefileにはその依存関係は含まれていない。 ヘッダファイルに関する依存関係を含めた Makefileは次のようになる。 サフィックスルール(.c.o)のところのマクロが、 $^ から $<に変わっていることに注意せよ。 g++ -c foo.cc -o foo.o g++ main.cc -MM -MP -MF main.d What is going on with this article? (3) includeオプションは,今のmakefileの処理を止めて,指定した別のmakefileの処理を行うというものらしい.上の例では,-include $(DEPS). 何があった Makefileのどのソースがそのヘッダに依存するとかの話があっていろいろ苦戦したのでメモ。 そもそも依存関係とは Makefileは、依存関係がズラーっと書いてあって、依存関係の末端にそのファイルの生成方法を書いておく、というのが基本的な考え方です。 図中のファイルMakefile-CONF.mkは、Makefile-Release.mk、Makefile-Debug.mkなどの、すべてのプロジェクト構成のための複数のファイルを表しています。 管理対象プロジェクトの場合、IDE自体がすべてのmakefileを生成し、依存性チェックの適切な手順を挿入します。 循環 - makefile 依存関係 自動 . Makefile から sub/Makefile に書かれた make hoge を実行するには cd sub && $(MAKE) hoge "CC=$(CC)" 外部ファイル hoge を読み込むには -include hoge; ヘッダファイル. こうなってしまった原因は、Makefileに書かれた依存関係が実際の依存関係を反映できていないためだ。main.cはfoo.hをインクルードしている以上、foo.hが変更されたら再コンパイルされるべきである。つまり、main.oはmain.cだけでなくfoo.hにも依存している。しかしMakefileではそれが表現されていない。そこで、Makefileにヘッダファイルの依存関係を書く方法を考えよう。 メークファイルヘッダの依存関係 (2) 私はmakeを使うのが初めてで、 このチュートリアルを通して基本を学んでいます。 チュートリアルの最終的なmakefileの例を次に示しま … この依存関係ファイルはmakefile最後のinclude文にてインクルードされることで依存しているヘッダファイル等が変更された場合に自動的に再コンパイルされるようになる。 リンクオプション (LDFLAGS) リンクオプションとしてLDFLAGSの値を用いる。初期値は空。 Makefile 別ディレクトリに中間ファイル & 自動依存関係設定 Posted by bosuke on 2013年6月29日 Leave a comment (3) Go to comments 普段、自分でMakefileを書くことはほとんど無い。 ヘッダのみのライブラリです)私は依存関係をリンクする方法 . Makefileの依存関係の記述を自動化する簡単な方法 ビルドにmakeコマンドを使うときにはMakefileにファイルの依存関係を書いておく必要があります。 しかし、開発の途中でインクルードするヘッダファイルが増えてくると、これらの依存関係を手作業で記述するのは面倒です。 大規模なC言語プログラムでは、ソースやヘッダファイルが複雑な… 2014-04-14 シェルスクリプトの平文パスワードをセキュアにする方法. 循環 - makefile 依存関係 自動 . そこで依存関係を自動生成することを考える。 例えば以下のようなディレクトリ構造を考える。 ├makefile ├src/ │├main.c │├sub1.c │└sub2.c └include/ ├header.h ├sub1.h └sub2.h. [][][] GCCの依存関係ファイル出力用のオプション. 追記: (2015/8/3) 大量のはてブが付いたので 続き を書きました… 2013-12-25 quickrunで部分コンパイル … 前回はMakefileをヘッダファイルの依存関係に対応させてみた。 そのMakefileは入力ファイル(ソース、ヘッダ)と出力ファイル(依存関係ファイル(.d)、オブジェクトファイル、実行ファイル)がすべて同じディレクトリにあることが前提となっていた。. ここで各ソースファイルの依存関係は以下のようだとする。 Makefile は,基本的にはターゲット/依存関係行とコマンド行の組を必要な数だけ並べて構成します.並べる順番は自由です.例えば,先に挙げた main2.c と func2.c から sample3 を生成する手順は: > cc -c main2.c > cc -c func2.c の部分は. 順番 関係 自動 標準 循環 原因 依存関係が破棄されました 依存関係 依存 並列 ライブラリ ヘッダファイル ヘッダ パス ディレクトリ makeするルールがありません make dependencies makefile header-files (C/C++で) (6) @mipadiが言ったこと以上に、依存関係のレコードを生成するために ' -M 'オプションの使用法を探ることもできます。 g++ -c main.cc -o main.o Makefileでソース、ヘッダファイルの依存関係を処理. GCCには生成するオブジェクトファイルが依存しているファイル(ソースファイルとそこからincludeしているファイル)の情報をMakefileの形式で出力する機能があって、以前も少しメモしている。 GCC 7.2のマニュアルだと 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 $ $ … Makefile をみればわかりますが、Suffix Rule の場合は foo.h への依存関係がありません。 そのため foo.h が更新されてもコンパイルは実行されません。 % touch foo.h % make -f Makefile.suffix make: `foo ' … 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 が定義されていると思えばよい。. 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でソース、ヘッダファイルの依存関係を処理 . g++ -c -o foo.o foo.cc Makefileを書いたのでここにメモしておきます。 参考にしたのはこちらのサイトです。 シンプルで応用の効くmakefileとその解説 - URIN HACK [Bash] ファイルやディレクトリの存在をチェックする方法 Makeでヘッダファイルの依存関係に対応する - wagavulinの日記 GNU make 日…

エクセル 重複データ まとめる 関数, 世帯 住民票 別, 海外ドラマ 地上波 放送予定 2020, 羽生結弦展 2018 グッズ, 高齢者 ひとり 暮らし 貧乏, ビバリー パズル 通販, イレブンカット カラー 色, インスタ フォロワー 正しく ない, 世にも 奇妙な物語 最多出演,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です