cygwinでredsvdを動かそうとして失敗したログ
追記: redsvd 0.1.2リリースによりeigen3beta2に対応しました。また、いくつかのバグらしきものについては報告済みです。以下の内容は古いですが一応残しておく。あとで整理。
なんでコンパイルごときに苦労せねばならぬのだパッケージ管理は闇だエラーメッセージは混沌だファッキンファッキン、云々。
環境
- cygwin 1.7系
- redsvd 0.1.1
あらすじ
ビルドは通るところまでいったけど結果がおかしい…… → 挫折
手順
基本的には、
- eigen3-beta1をインストール
- redsvdをインストール
以上。
注意が必要なのはeigen3-beta2では動かないと言うことです(beta2ではEign::SVDクラスが削除されたらしい)。
beta2を入れた状態でredsvdをビルドしようとすると以下のメッセージが。
[10-29 20:40:09] $ ./waf Waf: Entering directory `/cygdrive/c/home/src/redsvd-0.1.1/build' [ 1/17] cxx: src/redsvd.cpp -> build/default/src/redsvd_1.o [ 2/17] cxx: src/redsvd.cpp -> build/default/src/redsvd_2.o In file included from ../src/redsvd.cpp:21: ../src/redsvd.hpp: In member function `void REDSVD::RedSVD::run(Mat&, int)': ../src/redsvd.hpp:84: error: `SVD' is not a member of `Eigen' ../src/redsvd.hpp:84: error: expected primary-expression before '>' token ../src/redsvd.hpp:84: error: there are no arguments to `svdOfC' that depend on a template parameter, so a declaration of `svdOfC' must be available ../src/redsvd.hpp:84: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated) ../src/redsvd.hpp:88: error: `svdOfC' undeclared (first use this function) ../src/redsvd.hpp:88: error: (Each undeclared identifier is reported only once for each function it appears in.) In file included from ../src/redsvd.cpp:21: ../src/redsvd.hpp: In member function `void REDSVD::RedSVD::run(Mat&, int)': ../src/redsvd.hpp:84: error: `SVD' is not a member of `Eigen' ../src/redsvd.hpp:84: error: expected primary-expression before '>' token ../src/redsvd.hpp:84: error: there are no arguments to `svdOfC' that depend on a template parameter, so a declaration of `svdOfC' must be available ../src/redsvd.hpp:84: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated) ../src/redsvd.hpp:88: error: `svdOfC' undeclared (first use this function) ../src/redsvd.hpp:88: error: (Each undeclared identifier is reported only once for each function it appears in.) Waf: Leaving directory `/cygdrive/c/home/src/redsvd-0.1.1/build' Build failed: -> task failed (err #1): {task: cxx redsvd.cpp -> redsvd_2.o} -> task failed (err #1): {task: cxx redsvd.cpp -> redsvd_1.o}
eigen3-beta のインストール
手動でもできるらしいけどcmakeを入れたほうが楽じゃないかしら(cmakeはcygwinのパッケージに入ってます)。
pkg-configのデータであるpcファイルがデフォルトだと生成されないので、CMakeLists.txtを編集する必要がある。
# CMakeList.txt ... # if(NOT WIN32) option(EIGEN_BUILD_PKGCONFIG "Build pkg-config .pc file for Eigen" ON) # endif(NOT WIN32) ...
$ cd eign $ mkdir build $ cd build $ cmake .. (カレントディレクトリにmakeに必要な一式が生成される) $ make install
redsvd 0.1.1のインストール
PKG_CONFIG_PATHを設定してやらないとwaf(謎のビルドシステム)がeigen3を認識してくれないことに注意(eigen3の.pcファイルは/usr/local/share/pkgconfig/以下に配置される)
$ PKG_CONFIG_PATH=/usr/lib/pkgconfig/:/usr/local/share/pkgconfig/ ./waf configure $ ./waf
で、めでたくビルド+インストール完了。
$ build/default/test/accuracy_test.exe dense 100 100 10 10 0 0 -1.19209e-07 1 1 1 -0.105361 -0.105361 1 1 2 -0.210721 -0.210721 1 1 3 -0.316082 -0.316081 1 1 4 -0.421442 -0.421442 1 1 5 -0.526803 -0.526802 1 1 ...
ふむ、動くようだ。
と思って公式サイトのサンプルを試してみたところ
$ cat file1 1.0 2.0 3.0 4.0 5.0 -2.0 -1.0 0.0 1.0 2.0 1.0 -2.0 3.0 -5.0 7.0 $ redsvd -i file1 -o file1 -r 2 -f dense && cat file1.U file1.S file1.V compute SVD read matrix from file1 ... -7.69505e-08 sec. rows: 3 cols: 5 rank: 2 compute ... 0.000999923 sec. write file1.U write file1.S write file1.V 0.0109999 sec. finished. +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan +nan
うっ……(涙)