最近在看《视觉SLAM十四讲从理论到实践》这本书,第三章介绍了 三维空间刚体运动,其中用到了Eigen这个C++开源线性代数库,它提供与矩阵有关的线性代数相关运算,还包括解方程等功能。许多上层的软件库也使用Eigen来进行矩阵运算,包括g2o,Sophus。这里我运行了书中部分代码:
#include <iostream>
using namespace std;
#include <ctime>
#include <Eigen/Core>//核心部分
#include <Eigen/Dense>//稠密矩阵的代数运算(逆、特征值等)
using namespace Eigen;
#define MATRIX_SIZE 50
int main(int argc, char **argv)
{
Matrix<float, 2, 3> matrix_23;
Vector3d v_3d;
Matrix<float, 3, 1> vd_3d;
Matrix3d matrix_33 = Matrix3d::Zero();
Matrix<double, Dynamic, Dynamic> matrix_dynamic;
MatrixXd matrix_x;
matrix_23 << 1, 2, 3, 4, 5, 6;
cout << "matrix 2*3 from 1 to 6: \n" << matrix_23 << endl;
cout << "print matrix 2*3: " << endl;
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++) cout << matrix_23(i, j) << "\t";
cout << endl;
}
}
其中定义了一些Eigen的基本类型,并输出一个矩阵,但是在运行过程中出现了以下问题:
jw@jw-virtual-machine:~/Code$ g++ eigenMatrix.cpp -o eigenMatrix
eigenMatrix.cpp:6:36: fatal error: Eigen/Core: 没有那个文件或目录
compilation terminated.
因为我include了Eigen核心库,但是显示没有那个文件或目录,于是上网搜索:
解决 fatal error: Eigen/Core: No such file or directory_不乏希望的博客-优快云博客
这位博主给出了解决方案:
首先检查是否安装了Eigen库:
jw@jw-virtual-machine:~$ sudo updatedb
[sudo] jw 的密码:
jw@jw-virtual-machine:~$ locate eigen3
/usr/include/eigen3
/usr/include/eigen3/Eigen
/usr/include/eigen3/signature_of_eigen3_matrix_library
/usr/include/eigen3/unsupported
/usr/include/eigen3/Eigen/Cholesky
/usr/include/eigen3/Eigen/CholmodSupport
/usr/include/eigen3/Eigen/Core
这里的eigen3有太多,我只复制了一部分,可以看到,我是安装了eigen3库的。
然后检查CMakelist文件是否包含了eigen3库的头文件,也就是是否有以下代码:
include_directories("/usr/include/eigen3")
因为我只是创建了一个cpp文件,没有CMakelist文件,所以我在终端输入了以下命令并重新编译cpp文件:
jw@jw-virtual-machine:~/Code$ sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen
[sudo] jw 的密码:
jw@jw-virtual-machine:~/Code$ g++ eigenMatrix.cpp -o eigenMatrixjw@jw-virtual-machine:~/Code$ ./eigenMatrix
matrix 2*3 from 1 to 6:
1 2 3
4 5 6
print matrix 2*3:
1 2 3
4 5 6
可以看到文件编译,执行成功。
所以解决没有那个文件或目录的方法有三:
- 检查是否缺少库
- 查看CMakelist文件是否包含头文件
- 没有CMakelist文件的话,在终端输入命令链接Eigen库。