アホみたいなことで一日くらい潰したので備忘録。
C++でCUIのツイッタークライアントを作るべくここ最近ずっと無駄な苦労を重ねているSayahamittです。
作業しているフォルダにソースファイルが増えてきて、そろそろGitで管理すると面白いかな? なんて思ったのですが、作業フォルダにはヘッダファイルとボディファイルがディレクトリに別れず直に散らばっていて、しかもそのディレクトリでコンパイルするものだからオブジェクトファイルと実行ファイルも散乱しているし、挙句の果てには実験的なコードとその実行ファイルまで同じディレクトリに同居しているという始末…
さすがにこれではGitで管理しようにも監視下に置くファイルとそうでないファイルが同じディレクトリに混在してしまって面倒な事になりそう…
ということで、ソースファイルとコンパイル中間ファイルをディレクトリに分けて、Makeでコンパイルすることにしました。そうすればMakefileにcleanも書けるのでディレクトリに溜まったゴミファイルの削除も楽になって一石二鳥!!…と、簡単には行きませんでした。(;´д`)トホホ…
まずディレクトリ構成
--WorkingDirectory |--SourceDirectory | |--example.cpp | |--example.h |--ObjectfileDirectory |--Makefile
こんな構成になっていて、WorkingDirectoryでmakeしたらSourceDirectoryの中にあるソースファイルをコンパイルして、中間ファイルをObjectfileDirectoryに吐き出して、実行ファイルはWorkingDirectoryに生成するように出来たら見た目もスッキリするし、管理しやすい気がします。
ですが、ディレクトリを分けるとMakefileのターゲット名がとてもややこしくなって大変でした。.oが.cppに依存するサフィックスルールとその依存関係の記述でとても手間取りました。
んで、数時間に及ぶ試行錯誤の結果できたのがこれ
Makefileをまともに使うのも初めてだったので殆どコピペです(´・ω・`)
まず依存関係行ですが、これはソースファイル一つずつコンパイラに依存関係を教えてもらっています。一つのソースファイルにつき、一つの依存関係ファイルがObjectfileDirectoryに出来ます。そしてそれらを全てインクルードして処理をしています。
またディレクトリの名前については、同じ名前で拡張子の異なるファイルが同じ階層の異なるディレクトリに出来ることになります。(src/A.cppとobj/A.oなど) なのでMakefile関数の notdir を利用して、ls を実行して得られたソースファイルの相対パスからファイル名の部分だけを抽出しています。さらに STRING:%A=%B とすることでファイル名の拡張子を変更、それを予め用意しておいたディレクトリ名と結合させて、違うディレクトリの同じ名前を持つファイルを参照しています。
このMakefileを書くに当たって以下のサイトが大変参考になりました。有難う御座いました。