Ubuntu20.04安装pcl1.10.0 && pcl1.13.1 一文详细介绍安装步骤(带图)及报错解决
文章目录
- 一、apt 软件包安装(pcl1.10.0推荐)
- 二、源码安装(pcl高版本)
- 2.1 安装依赖环境
- 2.1.1安装基本依赖
- 2.1.2安装metslib
- 2.1.2安装VTK
- 2.2 编译安装PCL
- 2.3 报错解决
- 2.4 添加环境变量
- 2.5 版本验证
- 2.6 卸载pcl
- 三、配置c++/pcl开发环境
推荐Linux其他软件安装
Ubuntu/Debian小白从零开始配置深度学习环境和各种软件库(显卡驱动、CUDA、CUDNN、Pytorch、OpenCv、PCL、Cmake …)【持续维护】
一、apt 软件包安装(pcl1.10.0推荐)
使用apt安装方式,比较简单,但是版本不是最新的,一般Ubuntu20.04对应PCL1.10.0
具体查看下系统软件包里面opencv的版本
apt search libpcl-dev
sudo apt update
sudo apt upgrade
# 安装依赖
sudo apt-get install build-essential libboost-all-dev libeigen3-dev libflann-dev libvtk7-devlibavformat-dev libswscale-dev
# 直接一键安装
sudo apt install libpcl-dev
sudo apt install libpcl-dev pcl-tools
如果没有版本要求限制,此种安装方法比较快捷方便。
二、源码安装(pcl高版本)
2.1 安装依赖环境
如果以下依赖还不行,那安装过程中,缺少什么安装什么;PCL依赖环境比较多,不要急,我们一个个来。
2.1.1安装基本依赖
sudo apt update
sudo apt upgrade
sudo apt-get install git build-essential linux-libc-dev cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev libeigen3-dev libboost-all-dev
sudo apt-get install libqhull* libgtest-dev freeglut3-dev pkg-config libxmu-dev libxi-dev mono-complete openjdk-8-jdk openjdk-8-jre
# flann ubuntu20.4对应1.9
sudo apt-get install libopenni-dev libopenni2-dev libflann1.9 libflann-dev
#安装qt5
sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator
sudo apt install qt5-default
sudo apt-get install qttools5-dev
sudo apt install libqt5x11extras5-dev
2.1.2安装metslib
wget https://www.coin-or.org/download/source/metslib/metslib-0.5.3.tgz
tar xzvf metslib-0.5.3.tgz
cd metslib-0.5.3
./configure
make -j`nproc`
sudo make install
2.1.2安装VTK
用来可视化终端
#安装x11
sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
#安装opengl
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev
#安装libglut-dev 此步不行的话 需要手动源码安装VTK
sudo apt-get install freeglut3-dev
sudo apt-get install libvtk7.1-qt libvtk7.1 libvtk7-qt-dev
VTK官网:https://vtk.org/download/ 下载VTK-7.1.1.tar.g版本(本人看来很多帖子都是建议装7.1版本,暂不清楚原因)
tar -xzvf vtk-7.1.1.tar.gz
cd vtk-7.1.1
mkdir build && cd build
#先配置下qt的版本改成5 再依次点击Configure Generate
cmake-gui
cmake ..
make -j4
sudo make install
注意 Qt5UiPlugin_DIR的路径可能需要手动设置
2.2 编译安装PCL
pcl链接 Github 官网 目前最新版本是pcl-1.15.0,这里我们下载pcl-1.13.1
cd pcl-pcl-1.13.1
mkdir build && cd build
cmake ..
-DCMAKE_BUILD_TYPE=None
-DCMAKE_INSTALL_PREFIX=/usr/local
-DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu
-DFREETYPE_LIBRARY=/usr/lib/x86_64-linux-gnu/libfreetype.so
-DBUILD_GPU=ON
-DBUILD_apps=ON
-DBUILD_simulation=ON
-DBUILD_examples=ON
# 一般这步容易出错
make -j6
#make install指令pcl项目文件 转到默认的路径/usr/include 下
sudo make install
cmake … 成功界面
make -j6 成功界面
安装成功完后,会在usr/local/include/文件中,出现pcl-1.13文件,包含头文件。
2.3 报错解决
问题一: make[2]: *** 没有规则可制作目标“/usr/lib/x86_64-linux-gnu/libpcl_apps.so
原因: 多个pcl版本安装冲突导致,删除没有删除干净,定位到pcl库文件已经大部分链接中断
解决办法: 一定要卸载干净,重新安装
问题二: anaconda3/lib/libQt5X11Extras.so.5: undefined reference to `qt_version_tag@Qt_5.15’ anaconda 与系统默认的冲突
原因: 既然是qt_version_tag的问题,说明是qmake的版本不兼容导致,即当前QT使用的qmake和系统实际指定的qmake版本不一致。查看系统默认的qmake版本,一般来说是系统与anaconda中的lib版本冲突。以后遇见 xxx.so: undefined reference to xxx 其实问题本质是anaconda3与系统默认路径库文件版本冲突原因
qmake -version
dpkg -l | grep qt5
解决方法一: 退出当前环境
conda deactivate
解决方法二: 在使用编译的CMakeLists.txt文件里面添加一句话,让其指定搜索路径【推荐】
SET(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake")
添加这句话,其他的库文件也会在系统目录里面寻找;记得删除build里面所有建的环境,再次编译通过。
sudo make clean
解决方法三: 把有关anaconda3的配置环境注释掉
gedit ~/.bashrc
# 注释以下内容
# __conda_setup="$('/home/xjc/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
# if [ $? -eq 0 ]; then
# eval "$__conda_setup"
# else
# if [ -f "/home/xjc/anaconda3/etc/profile.d/conda.sh" ]; then
# . "/home/xjc/anaconda3/etc/profile.d/conda.sh"
# else
# export PATH="/home/xjc/anaconda3/bin:$PATH"
# fi
# fi
# unset __conda_setup
source ~/.bashrc
安装完后,再把注释改回来
解决方法四: 在CMakeLists.txt设置单独版本查找路径
find_package(Qt5 5.15 REQUIRED)
解决方法五: 重新把库文件链接到指定需要的文件
sudo apt-get install locate
# 使用命令ldd定位libwayland-client.so.0当中,所依赖的ffi库
$ ldd /lib/x86_64-linux-gnu/libwayland-client.so.0 | grep ffi
查看下anaconda3/lib/和 /usr/lib/x86_64-linux-gnu/ 对应得库版本是否一致 ,如果不一样则修改
locate libffi.so.7
# 查看系统的libffi
ll /lib/x86_64-linux-gnu/ | grep ffi
# 查看Anaconda的libffi
ll ~/anaconda3/lib/ | grep ffi
我们看到两个库不一样,一个是7.1.0,一个是8.1.2 ,因此把anaconda下的libffi.so.7指向系统的7.1.0
cd ~/anaconda3/lib/lib
sudo rm libffi.so.7
sudo ln -s /lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7
#再次查看
ll ~/anaconda3/lib/ | grep ffi
问题三: Sub-process /usr/bin/dpkg returned an error code (1) 修复安装包
sudo apt-get update
sudo apt-get upgrade
# 尝试修复损坏的软件包
sudo apt-get install -f
sudo dpkg --configure -a
2.4 添加环境变量
# 源码编译时 配置环境变量
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
使用nano文本编辑器打开.bashrc是隐藏的环境配置文件
nano ~/.bashrc
#滑动到末端,添加下面三段文本
export PCL_DIR=/usr/local/lib/pcl
export LD_LIBRARY_PATH=$PCL_DIR/lib
export PKG_CONFIG_PATH=$PCL_DIR/lib/pkgconfig
# 添加完后 先Ctrl+O保存,按Enter确定,再Ctrl+X退出nano编辑器
# 更新环境变量配置文件
source ~/.bashrc
2.5 版本验证
# 这里的1.x应替换为你安装的PCL版本号,例如1.10或1.12等
pkg-config --cflags pcl_common-1.x
apt-cache show libpcl-dev
如果输出了一些编译标志,说明PCL安装成功。
2.6 卸载pcl
# apt 安装方式卸载
sudo apt-get remove libpcl-dev
sudo apt-get purge libpcl-dev
# 源码手动安装方式卸载 大致原理是搜索pcl字眼全部删除
sudo rm -r build #把pcl1.xx的相应的文件夹删掉即可
sudo rm -r /usr/include/pcl-1.13.1 /usr/share/pcl /usr/bin/pcl* /usr/lib/libpcl*
sudo rm -r /usr/libx86_64-linux-gnu/libpcl*
三、配置c++/pcl开发环境
使用CMakeLists.txt配置pcl。创建一个文件夹,文件夹下包含:build文件夹、pcl_demo.cpp程序、CMakeLists.txt。
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(pcl_demo)
set(CMAKE_CXX_STANDARD 14) # 设置C++标准
# 查找PCL包
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS}) #PCL_INCLUDE_DIRS是系统自动命名,不要更改,添加PCL的头文件路径
link_directories(${PCL_LIBRARY_DIRS}) # 添加PCL的库路径
add_definitions(${PCL_DEFINITIONS}) # 添加编译选项 可选
# 添加可执行文件
add_executable(pcl_demo pcl_demo.cpp)
# 链接PCL库
target_link_libraries(pcl_demo ${PCL_LIBRARIES})
pcl_demo.cpp程序,在vscode里面,#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
std::cout << "PCL version: " << PCL_VERSION_PRETTY << std::endl;
// 创建一个简单的点云对象来测试基本功能
pcl::PointCloud<pcl::PointXYZ> cloud;
std::cout << "Test PCL !" << std::endl;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
uint8_t r(255), g(15), b(15);
for (float z(-1.0); z <= 1.0; z += 0.05) {
for (float angle(0.0); angle <= 360.0; angle += 5.0) {
pcl::PointXYZRGB point;
point.x = 0.5 * cosf (pcl::deg2rad(angle));
point.y = sinf (pcl::deg2rad(angle));
point.z = z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back (point);
}
if (z < 0.0) {
r -= 12;
g += 12;
}
else {
g -= 12;
b += 12;
}
}
point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
point_cloud_ptr->height = 1;
pcl::visualization::CloudViewer viewer ("test");
viewer.showCloud(point_cloud_ptr);
while (!viewer.wasStopped()){ };
// 如果代码执行到这里没有错误,说明PCL基本功能正常
std::cout << "PCL basic functionality test passed." << std::endl;
return 0;
}
cd build
cmake ..
make
./pcl_demo