GoogleのC++大規模非線形最適化ライブラリ「Ceres Solver」をWindows x64、Visual Studio 2013環境でビルドする方法を紹介します。
※2015/08/04 Visual Studio 2015でビルドできるように内容修正
用意するもの
- Eigen 3.0以上
- CMake 2.8.0以上
- Google Log 0.3.1以上
- Google Flags
- SuiteSparse
- METIS
- suitesparse-metis-for-windows
手順
1. CMakeをインストール。
2. Google Flagsのビルド
CMakeを利用してデフォルトのままビルドできます。
3. Google Logのビルド
logging.ccファイルの約1462行目の__asm int 3をコメントアウトします。(2015/08/04の時点で(0.3.4)修正)
Visual Studio 2015でビルドするためにはここの手順通りにソースを修正する必要があります。
google-glog.slnを開いてビルドします。
4. SuiteSparse, Metisのビルド
SuitSparse-x.x.xファイルを解凍し、出てきたSuiteSparseフォルダをsuitesparse-metis-for-windowsフォルダに入れます。
metis-x.x.xファイルを解凍し、出てきたmetis-x.x.xフォルダをmetisに変更してsuitesparse-metis-for-windowsフォルダに入れます。
metis/CMakeLists.txtファイルを開いて、project(METIS)の次にcmake_policy(SET CMP0022 NEW)を追加します。
metis/GKlib/gk_arch.hファイルを開いて
#ifdef __MSC__ /* MSC does not have rint() function */ #define rint(x) ((int)((x)+0.5)) /* MSC does not have INFINITY defined */ #ifndef INFINITY #define INFINITY FLT_MAX #endif #endif
を
#ifdef __MSC__ #if _MSC_VER < 1800 /* MSC does not have rint() function */ #define rint(x) ((int)((x)+0.5)) /* MSC does not have INFINITY defined */ #ifndef INFINITY #define INFINITY FLT_MAX #endif #endif #endif
に変更します。もし2013以前のVisual Studioを使う予定がないなら、削除してしまっても構いません。rint()とINFINITYが2013からデフォルトで入っているからです。
最後にCMakeLists.txtファイルの次の部分をコメントアウト(先頭に#をつける)します。これを行わない場合、手動でコンパイルされたファイルの名前を修正する羽目になります。(2015/08/04の時点で34-36行)
IF(MSVC) set(SP_LIB_PREFIX "lib") # Libs are: "libXXX" ENDIF(MSVC)
その他githubにあるビルド案内にしたがって各種設定を行い、CMakeを利用してsuitesparse-metis-for-windowsをビルドします。
5. Ceres Solverのビルド
Ceres SolverのフォルダをCMakeで開いてConfigureすると、エラーになるはずです。一個ずつ修正しながらConfigureを押してください
BLAS_blas_LIBRARYにはsuitesparse-metis-for-windowsのlibblas.libを設定してください。
LAPACK_lapack_LIBRARYにはsuitesparse-metis-for-windowsのliblapack.libを設定してください。
その他SuiteSparse関係の変数に該当するsuitesparse-metis-for-windowsのlibファイルを設定してください。
CMakeを設定が終わったらGenerateしてslnファイルからビルドします。