ubuntu重装/升级eigen教程

在尝试编译openMVG时遇到Eigen的SparseCholesky模块错误,问题根源是Eigen版本过低。通过卸载旧版Eigen(3.3.4),然后下载3.4.0版本源码,编译并安装,最后成功将Eigen升级,解决了编译问题。
摘要由CSDN通过智能技术生成

  重装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才行。于是首先需要将旧版本卸载。
  

1 卸载

执行如下命令,可以找出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,看还有没有没删除掉的文件,并进行删除即可。
  

2 安装

  卸载完成后,去官网下载所需版本。我这里需要3.4.0的,下载tar.gz的源码即可,然后解压到自己想放置的目录下。
在这里插入图片描述
  接下来,进入解压出来的文件夹,打开终端,依次执行如下命令进行编译和安装即可:

mkdir build
cd build
cmake ..
sudo make install

  安装完成后,再次查看当前eigen版本:

pkg-config --modversion eigen3

  可以看到,输出变成了3.4.0了,安装成功!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeeq_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值