eigen3多版本共存及与ceres兼容问题

eigen3多版本共存及与ceres兼容问题

  • eigen3多版本共存
    • 提前准备
      • usr/include/eigen3
      • /usr/lib/cmake/eigen3
      • /usr/share/pkgconfig/eigen3.pc
    • 源码安装
    • 版本切换
      • 步骤一
      • 步骤二
      • 步骤三
  • 参考

eigen3多版本共存

因为之前已经安装了eigen3.3.4和ceres2.1.0,可是这对组合并不能通过isc-loam的编译,看了晚上的解决方法说是提高eigen版本到3.3.7以上就可以了。但是刚刚试了一下,还是不行,看来没想的那么简单。

提前准备

因为之前已安装了eigen3.3.4,并且好多代码都是在这个环境的基础上搭建起来的,因此这个版本肯定不能扔掉。所以就想做一个3.3.4与3.3.8共存的一个eigen。所以首先应该把eigen3.3.4的一些东西给备份下来。其中的主要地方在:

usr/include/eigen3

在还没安装其他版本时,目前usr/include/eigen3中的东西是eigen3.3.4中的东西,里面是

eigen3多版本共存及与ceres兼容问题_第1张图片
这个文件夹里面的东西要记一下,因为要换成3.3.8中同样的文件里面的内容。

cmakelists中通常使用${EIGEN3_VERSION_STRING}变量来检查eigen版本,此变量通过/usr/lib/cmake/eigen3目录下的Eigen3Config.cmake文件得到;
安装多版本后,新的*.cmake文件生成在你安装的位置中的/eigen3/cmake目录下;例如:/usr/share/eigen3/cmake
因此先备份原来的文件夹及原来的安装文件:参考eigen安装及多版本管理

sudo mv /usr/include/eigen3 /usr/include/eigen334	#334为旧版本

/usr/lib/cmake/eigen3

cmakelists中通常使用${EIGEN3_VERSION_STRING}变量来检查eigen版本,此变量通过/usr/lib/cmake/eigen3目录下的Eigen3Config.cmake文件得到;
eigen3多版本共存及与ceres兼容问题_第2张图片

sudo mv /usr/lib/cmake/eigen3 /usr/lib/cmake/eigen334

/usr/share/pkgconfig/eigen3.pc

系统通过eigen3.pc这个文件搜索eigen库的,两种方式安装都会生成一个eigen3.pc文件,通过apt-get安装的存放在**/usr/share/pkgconfig文件夹下,通过源码安装的就存放在安装目录的/usr/local/share/pkgconfig**文件夹下,除了版本和安装位置不同外其它都一样,因此在旧版本中不更改eigen3.pc,因为一会安装完新版本后依旧可以使用这个文件,只更改里面代码就可以

这个里面的版本可以通过

pkg-config --modversion eigen3

查看

源码安装

官方源码地址:http://eigen.tuxfamily.org/index.php?title=Main_Page
下载所需版本(我下载的是3.3.8),解压

编译:

cd到eigen

mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/include/eigen338 ..             //安装到usr/include/eigen338
make
sudo make install

安装完成后去usr/include/eigen338看一下,这样会在usr/include/eigen338文件下生成eigen3库,进去后应该是长这样的:

eigen3多版本共存及与ceres兼容问题_第3张图片
其中include 中有一个eigen3文件夹,而这个eigen3文件夹就跟之前的usr/include/eigen3中的一样了
eigen3多版本共存及与ceres兼容问题_第4张图片

版本切换

步骤一

因此,进入include文件夹,执行以下命令:

sudo mv eigen3/ usr/include/eigen3

这样就是直接将3.3.8中的eigen3放在了usr/include/eigen3(如果想要换回3.3.4版本就把这个eigen3还放回到eigen338中,把eigen334改回eigen3就可以了,就是想用哪个版本哪个就是eigen3)到这里还不算完,因为还有.pc文件和.cmake文件还没换。

步骤二

系统是通过eigen3.pc这个文件搜索eigen库的,两种方式安装都会生成一个eigen3.pc文件,通过apt-get安装的存放在/usr/share/pkgconfig文件夹下,通过源码安装的就存放在安装目录的share/pkgconfig文件夹下,两个文件的对比如下:参考Eigen3多版本切换
eigen3多版本共存及与ceres兼容问题_第5张图片
可以看到,除了第一行的安装位置以及第七行版本的差别(左边第8行是我加的注释),两个文件没有其他差别,因此我们保留其中的一个就可以了,这里直接保存通过apt-get安装的存放在/usr/share/pkgconfig的.pc文件,在上图中就是左边那个,这个文件是不可修改的,因此需要加权限修改。

接下来对该文件进行修改,由于我们的eigen3放在了/usr/include下,因此第一行不用改,保持prefix=/usr即可,需要修改Version,用哪个版本就改成哪个版本号,如上图左边所示,另一个版本用//注释掉即可,修改完保存退出。

eigen3多版本共存及与ceres兼容问题_第6张图片

到目前为止,使用命令

pkg-config --modversion eigen3

已经可以看到版本已经更改为3.3.8了,但是呢,在编译的时候还是不能用,因为目前为止,cmake还找不到eigen3.3.8,因此得将cmake那里改一下。

步骤三

新安装的eigen的cmake文件在/usr/include/eigen338/eigen3/share/eigen3/cmake中,因此,

cd usr/include/eigen338/eigen3/share/eigen3/
sudo cp -r cmake/ /usr/lib/cmake/eigen338

这样在/usr/lib/cmake中就有了eigen334和eigen338两个文件夹,用哪个版本就将这个版本的文件夹名改为eigen3,因此将eigen338改为eigen3

sudo mv eigen338 eigen3

到目前为止,eigen3已经全部换成eigen3.3.8了

但是,当我编译时依旧会报错,报错为:

Failed to find Ceres - Found Eigen dependency, but the version of Eigen found (3.3.8) does not exa

意思就是ceres里面的编译版本是之前的3.3.4而你现在的eigen版本为3.3.8 因此,需要改一下

具体参考Found Eigen dependency, but the version of Eigen……编译问题解决

问题原因:安装版本与CMakeList文件所需版本不匹配
即将如下代码添加到/usr/local/lib/cmake/Ceres/CeresConfig.cmake中

set(EIGEN_INCLUDE_DIR "/usr/include/eigen3")  #添加此行
set(CERES_EIGEN_VERSION 3.3.8)  #添加此行,版本号与你安装的对应

并且上面原本的那个版本也让我改成了3.3.8
eigen3多版本共存及与ceres兼容问题_第7张图片

当我以为这下isc-loam应该可以编译通过的时候,确还是报了那个错,真的不理解,折腾这么大一会改了eigen3的版本,居然还是不行,还得再查查问题。

报的错误为:

在这里插入图片描述
但是其他我之前的代码还是可以正常编译的,之前的代码的环境是 ceres2.1.0和eigen3.3.4。现在换成了ceres2.1.0和eigen3.3.8依旧可以。

参考

1.Eigen3多版本切换
2.Linux系统下,如何安装多个不同版本的Eigen库且灵活调用呢?
3.eigen安装及多版本管理
4.eigen相关问题(安装、多版本切换、版本查看)
5.对eigen版本冲突的解决----多版本管理
6.Found Eigen dependency, but the version of Eigen……编译问题解决

你可能感兴趣的:(SLAM,linux,服务器,ubuntu)