编译ssl_slam2这个包的时候,编译是没有问题的,当运行ssl_slam2_mapping.launch文件的时候,会直接出现double free or corruption (out)这个问题.
检查发现是ssl_slam2_map_optimization_node这个节点出问题.
然后在其对应的class和node两个cpp文件中都添加了一下cout进行判别,是哪个位置导致了指针的双重释放....
但是最后没有找到,程序似乎在一运行就会产生double free or corruption out这个问题.
然后怀疑是gtsam这个库的问题.搜索有人提出pcl和gtsam一起用会有冲突.
搜索到说gtsam的版本和pcl的版本搭配.lego-loam是gtsam 4.0.0-alpha2 配pcl,所以尝试了从4.0.0-alpha2 -> 4.1.1中的所有版本,结果都是double free or corruption.
gtsam 的 issue 和 google小组讨论gtsam 提到由于框架不同,如果使用-march=native会导致内存不不对齐,所以在编译gtsam的时候要添加 -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF 以及 -DGTSAM_USE_SYSTEM_EIGEN=ON,通过这两个指令,让gtsam使用系统有的eigen进行编译,我的是3.3.4,然后不对框架进行优化加速.
但最后还是会double free
然后以eigen 和 double free or corruption 进行搜索,找到一篇知乎文章,在此感谢他.
从Eigen向量化谈内存对齐 - 知乎
这里面提到了关于eigen的特性,向量化内存对齐,如果不对齐,会在编译好一运行直接就崩溃.
里面提到,当不使用-march=native的时候,大家就都统一不要使用.如果使用就同一使用.
gtsam 通过 -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF 关闭
那么pcl怎么关闭,通过 -DPCL_ENABLE_SSE=OFF关闭,但是这里存疑,因为我对pcl-1.10.0关闭了,pcl-1.8没关闭,但是两个都可以用.
然后调查到cmakelist里面怎么开启框架优化 在CMAKE_CXX_FLAGS 里面添加 -march=native是优化,但是看到有人说-O3这里就会完成这步了,所以考虑-O3是否也有影响,直接修改为-O2,这样最后解决了这个问题.但是还是不是很明白,仅做记录
总的来说,就是
1.gtsam 编译的时候添加 -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF
2.pcl 编译的时候 -DPCL_ENABLE_SSE=OFF
3.cmakelist 里面CMAKE_CXX_FLAGS 添加 or 修改 -O3 为 -O2