Ubuntu18.04下本地编译安装PCL以及Python-PCL(无管理员权限)

由于平常的任务都在实验室的集群上运行,没有root权限,所以没办法直接apt安装,只能手动编译安装。下次再有类似情况的环境搭建,建议直接在虚拟机上的docker上apt安装好再导出,能节省很多时间和不必要的麻烦。

安装三个依赖库

  • 使用apt自动安装的博客已经有很多了,这里就不多说了,直接看编译安装的方式。
    首先进入PCL官网编译教程:https://pcl-tutorials.readthedocs.io/en/latest/compiling_pcl_posix.html首先安装依赖库。有四个必须安装的依赖库:Eigen、FLANN、Boost、VTK 和可选的:Qhull、OpenNI、CUDA
  • 因为集群环境不支持窗口可视化,所以VTK的编译安装略去,其编译安装过程同前三项依赖库相同。
  • cmake的教程和部分函数的说明可参见我的另外一篇blog。

Eigen

版本3.2.10
首先去Eigen官网或者github主页下载eigen的源码。然后执行如下命令:

mkdir build
cd build 
cmake -DCMAKE_INSTALL_PREFIX=your prefix ..
make install

Headers will be installed to <CMAKE_INSTALL_PREFIX>/<INCLUDE_INSTALL_DIR>.也就是说参数-DCMAKE_INSTALL_PREFIX使得include和lib的内容会被安装在your prefix下。

FLANN

版本1.9.1
同样clone源码,然后执行相同的命令:

mkdir build
cd build 
cmake -DCMAKE_INSTALL_PREFIX=your prefix ..
make install

报错:No package "liblz4" found
解决:
1.同上编译安装lz4,在环境变量中添加PKG_CONFIG_PATH=~/lz4/lib/以便CMakelist中的pkg_check_modules可以找到liblz4.pc文件。
2.还是无法解决的,可以注释掉CMakelist中lz4的部分,将需要的lz4的头文件lz4.h等移到flann中util等文件夹中。
3.有一点非常坑,flann中所需要的头文件是绝对路径,需要安装在根目录下,如果不是,就需要手动一个个改。

Boost

版本1.75.0
下载的Boost的包里有编译的脚本bootstrap.sh,记得将PREFIX改成自己想要设定的路径。贴一个安装Boost的链接:Linux平台的boost安装方法,一些常见的小错误也给出了解决方法。

PCL

首先去官网下载源码,python-pcl最高支持1.9.1的版本,最新的1.11.1并没有写在配置文件里。这里使用1.8.1的版本。执行如下命令:

cd pcl-pcl-1.9.1
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j2 #使用2个线程,加快速度
make -j2 install

接下来是一些遇到的bug。

  1. Requires external library xxxx.
    解决方法:找到CMAKE_MODULE_PATH ,一般在当前目录下cmake/Modules中,找到Findxxxx.cmake,添加inculde path如:
    list(APPEND CMAKE_INCLUDE_PATH <your include dir>)
  2. ‘eigen_assert_exception’ is not a member of ‘Eigen’
    解决方法:这是由于下载的包可能缺少文件,去clone官方库重新编译安装即可。
  3. undefined reference to boost::system::system_category()
    解决方法
    在编译时加入链接库-lboost_filesystem -lboost_system:
    在CMakelist中加入
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_filesystem -lboost_system")
    CMAKE_C_FLAGS 设置C编译选项
    CMAKE_CXX_FLAGS 设置C++编译选项
  4. pcl-pcl-1.8.1/surface/include/pcl/surface/impl/bilateral_upsampling.hpp:112:88: error: cannot convert ‘Eigen::internal::enable_if, float, float> >::type {aka Eigen::IndexedView, float, float>}’ to ‘float’ in initialization float val_exp_depth = val_exp_depth_matrix(dx+window_size_, dy+window_size_);
    解决方法
    由于PCL和Eigen版本不兼容的问题,使用最新版本的PCL。PCL1.8.1下使用Eigen-3.2.10可解决此问题。
  5. kdtree.so.1.8.1:undefined reference to `LZ4_decompress_safe_continue’
    解决方法
    在每次重新编译后make时将/lz4/lib/liblz4.so添加到/pcl/build/kdtree/CMakeFiles/pcl_kdtree.dir/下的link.txt里。
  6. missing:QHULL_LIBRARY
    解决方法:编译安装旧版本qhull7.3.2

python-pcl

clone源码,路径下自带build.sh。如果不需要VTK,需要去setup.py手动注释掉相关的代码。
报错:_pcl.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN5boost6system15system_categoryEv
解决方法
加上ext_args[‘libraries’].append(‘boost_system’),并将ext_args[‘library_dirs’]的第一个目录设为boost所在目录。这样做的目的是在编译链接时加入-lboost_system。

最后import pcl不报错就算阶段性成功了!

总结

  1. 本次安装环境为:
    ubuntu18.04,无root权限,
eigen-3.2.10
flann-1.9.1
boost-1.75.0
pcl-1.8.1
python-pcl
  1. 错误都在编译链接的过程中,最麻烦的是路径问题,涉及到的相关函数可以查阅cmake官方文档。
  2. 最好在docker环境中一键apt安装。
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值