重装eigen的原因是在编译openmvg的时候,报了如下一堆错误:
/usr/include/eigen3/Eigen/SparseCholesky:34:2: error: #error The SparseCholesky module has nothing to offer in MPL2 only mode
#error The SparseCholesky module has nothing to offer in MPL2 only mode
^~~~~
In file included from /usr/include/eigen3/Eigen/SparseCholesky:37:0,
from /home/czq/softwares/openMVG/src/openMVG/multiview/rotation_averaging_l1.cpp:37:
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:266:72: error: ‘AMDOrdering’ does not name a type; did you mean ‘COLAMDOrdering’?
plate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialLLT;
^~~~~~~~~~~
COLAMDOrdering
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:266:83: error: expected ‘>’ before ‘<’ token
ame _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialLLT;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:267:72: error: ‘AMDOrdering’ does not name a type; did you mean ‘COLAMDOrdering’?
plate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialLDLT;
^~~~~~~~~~~
COLAMDOrdering
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:267:83: error: expected ‘>’ before ‘<’ token
ame _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialLDLT;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:268:72: error: ‘AMDOrdering’ does not name a type; did you mean ‘COLAMDOrdering’?
plate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialCholesky;
^~~~~~~~~~~
COLAMDOrdering
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:268:83: error: expected ‘>’ before ‘<’ token
ame _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::StorageIndex> > class SimplicialCholesky;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:515:60: error: template argument 3 is invalid
typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:515:62: error: template argument 1 is invalid
typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:516:59: error: template argument 3 is invalid
typedef internal::traits<SimplicialLLT<MatrixType,UpLo> > LLTTraits;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:516:62: error: template argument 1 is invalid
typedef internal::traits<SimplicialLLT<MatrixType,UpLo> > LLTTraits;
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h: In member function ‘void Eigen::SimplicialCholesky<_MatrixType, _UpLo, _Ordering>::_solve_impl(const Eigen::MatrixBase<OtherDerived>&, Eigen::MatrixBase<OtherDerived>&) const’:
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:605:27: error: qualified-id in declaration before ‘(’ token
LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:607:26: error: qualified-id in declaration before ‘(’ token
LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:616:27: error: qualified-id in declaration before ‘(’ token
LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
^
/usr/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h:618:26: error: qualified-id in declaration before ‘(’ token
LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
^
/home/czq/softwares/openMVG/src/openMVG/multiview/rotation_averaging_l1.cpp: In function ‘bool openMVG::rotation_averaging::l1::internal::SolveIRLS(const RelativeRotations&, openMVG::rotation_averaging::l1::Matrix3x3Arr&, const sMat&, unsigned int, double)’:
/home/czq/softwares/openMVG/src/openMVG/multiview/rotation_averaging_l1.cpp:460:53: error: template argument 3 is invalid
using Linear_Solver_T = Eigen::SimplicialLDLT<sMat>;
^
/home/czq/softwares/openMVG/src/openMVG/multiview/rotation_averaging_l1.cpp:462:3: error: ‘Linear_Solver_T’ was not declared in this scope
Linear_Solver_T linear_solver;
^~~~~~~~~~~~~~~
/home/czq/softwares/openMVG/src/openMVG/multiview/rotation_averaging_l1.cpp:463:3: error: ‘linear_solver’ was not declared in this scope
linear_solver.analyzePattern(A.transpose() * A);
^~~~~~~~~~~~~
其原因是eigen的版本太旧了,需要重装升级。查看eigen版本可以执行如下命令:
pkg-config --modversion eigen3
我这里输出为:
3.3.4
我们需要把它升级到3.4.0才行。于是首先需要将旧版本卸载。
执行如下命令,可以找出eigen3的所有路径:
sudo updatedb
locate eigen3
会获得一堆输出,其实不用一个个删除,从目录上删就行了。依次执行如下命令即可:
sudo rm -rf /usr/include/eigen3
sudo rm -rf /usr/lib/cmake/eigen3
sudo rm -rf /usr/share/doc/libeigen3-dev
sudo rm -rf /usr/local/share/eigen3
sudo rm -rf /usr/local/include/eigen3
sudo rm -rf /usr/local/lib/pkgconfig/eigen3.pc
sudo rm -rf /usr/local/share/pkgconfig/eigen3.pc /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums
要查看有没有卸载干净,可以重新locate eigen3,看还有没有没删除掉的文件,并进行删除即可。
卸载完成后,去官网下载所需版本。我这里需要3.4.0的,下载tar.gz的源码即可,然后解压到自己想放置的目录下。
接下来,进入解压出来的文件夹,打开终端,依次执行如下命令进行编译和安装即可:
mkdir build
cd build
cmake ..
sudo make install
安装完成后,再次查看当前eigen版本:
pkg-config --modversion eigen3
可以看到,输出变成了3.4.0了,安装成功!