GPUPPURの配布の仕方
多くのC++のライブラリは、ライブラリファイルをプログラムにリンクし、ライブラリ内の関数やクラスを使うソースコードではライブラリのヘッダファイルをインクルードするというふうになっています。GPUPPURでもお世話になっているBoost C++ libraryはインストール時にいくつかのライブラリをコンパイルする必要がありますが、ほとんどの機能はヘッダファイルをインクルードするだけで使えます。
ライブラリを使うには、ライブラリをコンパイルしてプログラムにリンクできるようなライブラリファイルにする方法と、ライブラリはソースコードのままでヘッダファイルをインクルードするだけで使えるようにする方法があります。
ライブラリを使う側から見た違い
コンパイル済みのリンクライブラリにした場合
ライブラリを作る側から見た違い
コンパイル済みのリンクライブラリにした場合
ヘッダファイルのみのライブラリにした場合
- ヘッダファイルをそのままパッケージに入れるだけ
- ヘッダファイルを修正する度にすべてのヘッダファイルをコンパイルしないといけない。コンパイル時間が長くなる
- ヘッダファイル内でusing namespaceを使うのはまずいのでnamespaceを指定した書き方をしないといけない。ソースコードが長ったらしくなる
GPUPPURは今のところ.hppファイルと.cppファイルが混ざっていてリンクするライブラリファイル方式っぽくなってますが、やはり各環境でコンパイルできるようにmakefile等を書いたりするのが面倒なのと、templateを使ったクラスが多いのでヘッダファイルのみのライブラリにしようかなと考えています。ヘッダファイル方式の一番の弱点はコンパイル時間が長くなることですが、大抵のコンパイラにプリコンパイル済みヘッダを使えるようなので(gccでも使えるらしい。使ったことないけど)それほど問題ないでしょう。むしろ、GPUPPURにboost.preprocessorを使って大量のソースコードを自動生成している行列テンプレートクラスがあってそれは必ずヘッダファイルに書かないといけないので、コンパイル済みライブラリにしようがヘッダファイルのみにしようがそれほどコンパイル時間があまり変わらないという状態になってます。
ちなみに自宅のPC
CPU:sempron 2800+
memory:1GByte
compiler:VC++2005
Debug用ビルド
でGPUPPURをコンパイルしたときの時間を計ってみると
0から全部コンパイルした場合は65秒
全部コンパイルした後に.objファイルのみを消してビルドしたときは23秒
ヘッダファイルのコンパイルに約40秒掛かってるようです。
GPUPPURをヘッダファイルのみのライブラリにするかどうか悩むな・・・