由于平常的任务都在实验室的集群上运行,没有root权限,所以没办法直接apt安装,只能手动编译安装。下次再有类似情况的环境搭建,建议直接在虚拟机上的docker上apt安装好再导出,能节省很多时间和不必要的麻烦。
编译安装PCL
- 安装三个依赖库
- Eigen
- FLANN
- Boost
- PCL
- python-pcl
- 总结
安装三个依赖库
- 使用apt自动安装的博客已经有很多了,这里就不多说了,直接看编译安装的方式。
首先进入PCL官网编译教程:/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
可以找到文件。
2.还是无法解决的,可以注释掉CMakelist中lz4的部分,将需要的lz4的头文件等移到flann中util等文件夹中。
3.有一点非常坑,flann中所需要的头文件是绝对路径,需要安装在根目录下,如果不是,就需要手动一个个改。
Boost
版本1.75.0
下载的Boost的包里有编译的脚本,记得将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。
- Requires external library xxxx.
解决方法:找到CMAKE_MODULE_PATH
,一般在当前目录下cmake/Modules中,找到,添加inculde path如:
list(APPEND CMAKE_INCLUDE_PATH <your include dir>)
- ‘eigen_assert_exception’ is not a member of ‘Eigen’
解决方法:这是由于下载的包可能缺少文件,去clone官方库重新编译安装即可。 - 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++编译选项 - 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可解决此问题。 - .1.8.1:undefined reference to `LZ4_decompress_safe_continue’
解决方法:
在每次重新编译后make时将/lz4/lib/添加到/pcl/build/kdtree/CMakeFiles/pcl_kdtree.dir/下的里。 - missing:QHULL_LIBRARY
解决方法:编译安装旧版本qhull7.3.2
python-pcl
clone源码,路径下自带。如果不需要VTK,需要去手动注释掉相关的代码。
报错:_pcl.cpython-36m-x86_64: undefined symbol: _ZN5boost6system15system_categoryEv
解决方法:
加上ext_args[‘libraries’].append(‘boost_system’),并将ext_args[‘library_dirs’]的第一个目录设为boost所在目录。这样做的目的是在编译链接时加入-lboost_system。
最后import pcl不报错就算阶段性成功了!
总结
- 本次安装环境为:
ubuntu18.04,无root权限,
eigen-3.2.10
flann-1.9.1
boost-1.75.0
pcl-1.8.1
python-pcl
- 错误都在编译链接的过程中,最麻烦的是路径问题,涉及到的相关函数可以查阅cmake官方文档。
- 最好在docker环境中一键apt安装。