过程曲折,耗时很长,我很菜。。
最后的方法是更新boost版本,然后cmake版本也得随之更新。
0.gtsam和Kimera-RPGO源码地址:
gtsamhttps://github.com/borglab/gtsam
Kimera-RPGOhttps://github.com/MIT-SPARK/Kimera-RPGO
1.第一阶段编译
使用了原有的1.65版本boost和3.9版本cmake,boost的.so和.a库安装在usr/lib/x86_64_gnu下。
这一阶段编译会出错,需要在gtsam和Kimera-RPGO的CMakelist.txt里各种加东西。
在cmake ..报错主要是类似:
(1)Could NOT find Boost (missing: system thread filesystem)
(2)Target “xxx” links to target "Boost::filesystem" but the target was not found.
解决完cmake之后,make主要出现的问题类似是:
/usr/bin/ld: cannot find -lBoost::serialization
上述问题在网上查了,对我而言都治标不治本。
也看到了更新boost的解决方法,最后决定重装boost。
下面重点记录重装boost后遇到的一些编译问题。
2. 第二阶段编译(重装boost和cmake)
千万不要使用autoremove boost 类似的命令!!!
(1)重装boost,由1.65.10升级到1.70.0,参考博客如下:
注意,经过后续观察,我的电脑(ubuntu18.04)应该是可以多版本boost共存。
所以ubuntu18.04自带的1.65.1版本boost可以不卸载,也就是下面博客中的卸载步骤不要执行,否则会导致ros相关包编译出问题。
Ubuntu16.04 卸载旧版本Boost库并安装新版本https://blog.csdn.net/qq_42037180/article/details/109343000
执行链接中的如下命令时:
sudo ./b2 install
修改为:
sudo ./b2 cxxflags=-fPIC cflags=-fPIC -a -d+2
sudo ./b2 cxxflags=-fPIC cflags=-fPIC -a -d+2 install
加入fPIC的原因是:博客中的boost安装方法使用了编译好的静态库.a文件,会带有本地电脑的一些属性,需要加fPIC参数对静态库重新编译,加入自己电脑的属性。(大概意思是这个)
如果不加入fPIC,我在make时报了类似这个的错:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
(2)重装cmake
由cmake3.9升级为3.15.0,主要是适配boost的版本,否则报错如下:
cmake_policy PUSH without matching POP
以上问题都解决之后,gtsam和Kimera-RPGO都可以编译通过了。
3. 思考
ubuntu18.04自带的1.65.1版本的boost不在/usr/local下,它的库文件和头文件分别在/usr/lib/x86_64-linux-gnu和/usr/include/boost下。
新安装的boost1.70的库文件和头文件分别在/usr/local/lib/和/usr/local/include下,按照安装教程配置好他的搜索路径后,从github上下载的源码基本可以直接找1.70的boost。
而1.65.1的boost可以继续用于原先安装的ros等包。