1.重要的事情说三遍
别用autoremove,别用autoremove,别用autoremove,如果你看到某篇博客写了要你卸载什么,重装什么,千万别用autoremove就行,具体原因百度会告诉你答案。我就是按照一篇博客里写的删除qt5用autorempve然后删除了很多重要的东西的,现在很后悔。。。
2.安装步骤主要参照这两篇博客:
https://blog.youkuaiyun.com/weixin_41070687/article/details/102841946
https://blog.youkuaiyun.com/lilywri823/article/details/86583269
3.问题:
make的时候出现如下错误:
/usr/lib/x86_64-linux-gnu/libSM.so: undefined reference to `uuid_generate@UUID_1.0'
/usr/lib/x86_64-linux-gnu/libSM.so: undefined reference to `uuid_unparse_lower@UUID_1.0'
collect2: error: ld returned 1 exit status
outofcore/tools/CMakeFiles/pcl_outofcore_viewer.dir/build.make:373: recipe for target 'bin/pcl_outofcore_viewer' failed
make[2]: *** [bin/pcl_outofcore_viewer] Error 1
CMakeFiles/Makefile2:1425: recipe for target 'outofcore/tools/CMakeFiles/pcl_outofcore_viewer.dir/all' failed
make[1]: *** [outofcore/tools/CMakeFiles/pcl_outofcore_viewer.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
百度到了这篇博客:
https://www.cnblogs.com/BambooEatPanda/p/10682670.html
里面提到了这个链接:
https://stackoverflow.com/questions/45584275/getting-error-usr-lib-lib64-libsm-so-undefined-reference-to-uuid-unparse-l
我搜索过:libSM.so本身在计算机中。解决方案是从路径中删除anaconda lib文件夹,然后重新构建。具体步骤如下:
1.在你build的文件夹打开终端:
echo $PATH
我得到的输出是这样的:里面记录了path的路径:
/home/alexander/anaconda3/bin:/home/alexander/anaconda3/condabin:/opt/ros/kinetic/bin:/home/alexander/bin:/home/alexander/.local/bin:/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
2.
删除里面所有和anaconda有关的路径,重新定义path:
PATH=/opt/ros/kinetic/bin:/home/alexander/bin:/home/alexander/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
3.查看修改结果:
echo $PATH
/opt/ros/kinetic/bin:/home/alexander/bin:/home/alexander/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
修改成功。
4.继续重新创建build文件夹,重新make。
5.在终端修改的好处是不会永久修改path,当你下次打开终端时,环境变量又变回之前没有修改的亚子。毕竟anaconda还是要用的嘛。
4.很不幸,结果依旧失败了。。最后选择了以下博客提供的终极解决方案:
博客写到原因可能是:undefined reference,本身是一个c++编译常见错误undefined reference to错误的解决方法中写到:
-
1. 另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找. 2. 比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和libx.so, 3. 这个时候会使用在./A的libx.a 而不会遵循动态库优先的原则, 4. 因为./A是先找到的,并且没有同名动态库存在
虽然我已经从path中剔除了与anaconda相关的路径,但不知为何系统依旧会优先筛选anaconda。总之,把anaconda2/lib下的libuuid库文件移走就好了:
-
ls ~/anaconda3/lib/libuuid*
-
mkdir ~/anaconda3/libuuid
-
mv ~/anaconda3/lib/libuuid* ~/anaconda3/libuuid
终于迈过了这道坎,最后记得把文件再移回来。感谢这个博客的作者:
https://blog.youkuaiyun.com/u014734886/article/details/93029349
5.到81%左右又出现了如下问题:
/home/alexander/anaconda3/lib/libpng16.so.16: undefined reference to `inflateValidate@ZLIB_1.2.9'
collect2: error: ld returned 1 exit status
apps/CMakeFiles/pcl_pcd_video_player.dir/build.make:229: recipe for target 'bin/pcl_pcd_video_player' failed
make[2]: *** [bin/pcl_pcd_video_player] Error 1
CMakeFiles/Makefile2:8613: recipe for target 'apps/CMakeFiles/pcl_pcd_video_player.dir/all' failed
make[1]: *** [apps/CMakeFiles/pcl_pcd_video_player.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
搜索了很久都没有找到解决方案,最后依旧用上述方法暴力破解了。
总结就是:anaconda环境很坑,很多包其实在原系统中安装就都不会报错。以后在遇到这种问题,首先考虑anaconda的原因!
6.运行程序pointcloud_mapping时报错:
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
参照此博客作了修改:
https://blog.youkuaiyun.com/luanfei3717/article/details/80268597?utm_source=blogxgwz6
1.加上头文件include<Eigen/StdVector>
2.将所有std::vectorEigen::?? 都改为std::vector<Eigen::??,Eigen::aligned_allocatorEigen::??>(不是真的问号,根据变量类型而定)
修改后成功!感谢老哥
6.运行程序surfel_mapping时报错:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
蠢了,这次的原因是.pcd文件路径没有找对。在configure里设置路径就OK了