GPUPPURの配布の仕方

多くのC++のライブラリは、ライブラリファイルをプログラムにリンクし、ライブラリ内の関数やクラスを使うソースコードではライブラリのヘッダファイルをインクルードするというふうになっています。GPUPPURでもお世話になっているBoost C++ libraryはインストール時にいくつかのライブラリをコンパイルする必要がありますが、ほとんどの機能はヘッダファイルをインクルードするだけで使えます。

ライブラリを使うには、ライブラリをコンパイルしてプログラムにリンクできるようなライブラリファイルにする方法と、ライブラリはソースコードのままでヘッダファイルをインクルードするだけで使えるようにする方法があります。

ライブラリを使う側から見た違い

コンパイル済みのリンクライブラリにした場合
  • コンパイル済みライブラリか自分の環境でコンパイルできるようになったパッケージからインストール
  • 自分のプログラムをコンパイルするときにライブラリまでコンパイルする必要がない
  • デバッグ用とリリース用、static/dynamicリンク等の複数のリンクライブラリを使い分けないといけない
ヘッダファイルのみのライブラリにした場合
  • ヘッダファイルを入手して、それらをインクルードパスの通ったところに置いてインストールする
  • コンパイル時間が長くなる。(プリコンパイル済みヘッダを使えば軽減できる)
  • すべての関数がインライン展開される(かもしれない)

ライブラリを作る側から見た違い

コンパイル済みのリンクライブラリにした場合
  • ライブラリを各環境用にコンパイルして配布するか、各環境でコンパイルできるようにmakefile等を書いてパッケージにする。
  • static/dynamicリンクができるようにソースコードを書かないといけない。
  • templateを使いたいときは基本的にヘッダファイルに書かないといけない。
ヘッダファイルのみのライブラリにした場合
  • ヘッダファイルをそのままパッケージに入れるだけ
  • ヘッダファイルを修正する度にすべてのヘッダファイルをコンパイルしないといけない。コンパイル時間が長くなる
  • ヘッダファイル内で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をヘッダファイルのみのライブラリにするかどうか悩むな・・・