1. 为什么我推荐你用apt装PCL?聊聊源码安装的“坑”
如果你刚开始接触点云处理,想在Ubuntu 20.04上把PCL(Point Cloud Library)这个强大的工具库跑起来,那你大概率会面临一个经典选择:是去官网下载源码自己编译,还是直接用系统自带的包管理工具apt来安装?
我以过来人的身份告诉你,对于绝大多数刚上手、想快速验证想法或者做项目开发的兄弟,直接用apt安装是最高效、最不容易出错的路子。我知道,很多技术教程喜欢鼓吹“源码安装大法好”,能装最新版,能自定义编译选项。这话没错,但前提是你得有足够的时间和耐心去填坑。
我自己就曾经头铁,尝试过在Ubuntu上源码编译安装PCL。那体验,简直是一场“依赖地狱”的冒险。PCL本身是个“巨无霸”,它依赖了一票其他重量级库,比如VTK(可视化工具包)、FLANN(快速最近邻搜索库)、Boost(C++万能工具箱)、Eigen(线性代数库)等等。这些库本身版本就多,相互之间的依赖关系错综复杂。你从PCL官网下个源码包,cmake的时候,缺这个少那个是家常便饭。更头疼的是,你好不容易把某个依赖库的指定版本装上了,可能会跟你系统里已经存在的、通过apt安装的其他软件产生冲突,导致一些莫名其妙的运行时错误。我印象最深的一次是,为了一个VTK的兼容性问题,折腾了整整一个下午,最后发现是OpenGL驱动版本不匹配,那种挫败感,新手真的很难扛得住。
所以,除非你有非常特殊的定制化需求(比如必须启用某个默认关闭的模块,或者要针对特定硬件做极致优化),否则在Ubuntu 20.04这个长期支持版上,拥抱apt提供的稳定版本,是最明智的选择。apt最大的好处就是“省心”。它会自动帮你解决所有依赖关系,确保安装的PCL库和它依赖的所有组件都是经过官方仓库测试、彼此兼容的稳定版本。你不需要关心VTK该装哪个版本,Eigen会不会冲突,一条命令下去,系统帮你打理得明明白白。我们的目标是快速上手,把精力集中在点云算法和应用开发上,而不是在环境搭建上消耗斗志。接下来,我就带你一步步走通这条最安稳的路,并把路上可能遇到的小石子(坑)都给你标出来。
2. 动手之前:搞清你的Ubuntu和PCL版本
在敲下任何安装命令之前,有一个关键步骤绝对不能跳过:弄清楚你的系统能提供什么,以及你需要什么。这就像去超市买东西,你得先知道超市有没有货(系统仓库里的PCL版本),再看看是不是你想要的牌子(版本号)。
2.1 查看你的Ubuntu系统版本
虽然我们标题说了是Ubuntu 20.04,但保不齐有人系统升级过或者记混了。确认一下总没错。打开你的终端,输入:
lsb_release -a
你会看到类似这样的输出:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
重点看 Codename 这一行,显示为 focal。这个代号非常重要,它代表了Ubuntu 20.04的内部项目代号。后面我们配置软件源(apt源)时,用的就是这个代号,而不是数字版本号。记住它:focal。
2.2 探查apt仓库里的PCL版本
Ubuntu官方软件仓库(以及像阿里云、清华这样的镜像站)为每一个系统版本(代号)都维护了一套经过充分兼容性测试的软件包。PCL也不例外。我们需要先看看,在focal这个版本的仓库里,能安装的PCL最高版本是多少。
在终端里运行这个查询命令:
apt-cache show libpcl-dev | grep Version
这条命令的意思是:查询名为libpcl-dev这个软件包的详细信息,并用grep过滤出包含“Version”的行。libpcl-dev是PCL的开发包,包含了编译所需的头文件和链接库。
执行后,你大概率会看到这样的结果:
Version: 1.10.0+dfsg-5ubuntu1
看,版本是1.10.0。这就是Ubuntu 20.04官方仓库提供的PCL版本。有些朋友可能会问:“网上都说PCL有1.11、1.12甚至更新的版本了,1.10是不是太老了?” 这里有个认知误区需要澄清。对于Ubuntu这样的稳定发行版,其核心软件仓库在系统发布时就已经固定了主要软件的大版本号。在系统的整个支持周期内(对于20.04 LTS是5年),仓库主要提供的是安全更新和严重的错误修复,而不是频繁升级到大版本。这样做是为了保证整个系统生态的极度稳定。PCL 1.10本身已经是一个非常成熟和功能完备的版本,涵盖了绝大多数点云处理的基础和高级算法。对于学习、科研和大部分工业应用来说,1.10版本完全足够,而且其稳定性经过了海量用户的长期验证。盲目追求新版本,在Linux系统环境下,往往意味着要自己引入不稳定的因素。
所以,请接受这个设定:在Ubuntu 20.04上,通过apt安装PCL,得到的就是稳定可靠的1.10版本。这是我们后续所有操作的基础。
3. 确保安装流畅:配置一个靠谱的软件源
“软件源”是什么?你可以把它想象成手机上的“应用商店”。apt这个包管理工具,需要知道去哪个“商店”里下载软件。默认情况下,Ubuntu使用的是官方源,服务器可能在国外。对于国内用户,这可能会导致下载速度极其缓慢,甚至因为网络问题完全失败,这就是为什么有时候执行sudo apt-get update或sudo apt-get install会卡住或者报错的原因。
因此,将软件源替换为国内的镜像源,是提升Ubuntu使用体验(尤其是安装软件速度)的必备操作。国内常用的有阿里云镜像、清华大学镜像、华为云镜像等,速度都非常快。这里我以阿里云镜像为例,因为它比较稳定和通用。
重要提示:在修改系统关键配置文件之前,养成备份的好习惯!这样万一操作失误,还能轻松恢复。
3.1 备份原有的源列表文件
首先,我们给系统自带的源列表文件加个“保险”:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
这条命令将/etc/apt/sources.list文件复制了一份,命名为backup。如果后续新源有问题,你可以用sudo cp /etc/apt/sources.list.backup /etc/apt/sources.list命令轻松还原。
3.2 清空并写入新的镜像源
接下来,我们直接编辑源列表文件。你可以使用任何你熟悉的文本编辑器,比如vim、nano或者gedit。这里我用nano,因为它对新手更友好:
sudo nano /etc/apt/sources.list
打开文件后,你会看到里面有很多行以deb或deb-src开头的网址。直接把这些内容全部删除(在nano里,你可以用Ctrl+K快捷键逐行剪切)。然后,将下面为Ubuntu 20.04(focal)配置的阿里云镜像源完整地粘贴进去:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
粘贴时请务必注意:每一行末尾不要有多余的空格。focal这个代号一定要正确,如果你用的是其他Ubuntu版本(比如22.04是jammy),这里要相应修改。
粘贴完成后,按Ctrl+O(字母O)保存文件,再按Ctrl+X退出nano编辑器。
3.3 更新本地软件包缓存
换了新的“应用商店”地址,我们需要让apt工具去同步一下新商店里的商品目录。执行:
sudo apt-get update
这个命令会访问我们刚刚设置的阿里云镜像站,下载最新的软件包列表信息到本地。看到终端里飞速滚动的[连接 mirrors.aliyun.com]和[获取]字样,并且最后没有报错,显示“全部完成”或类似信息,就说明源配置成功了。现在,你的apt下载速度将会得到质的飞跃。
4. 核心安装:两条命令搞定PCL及其依赖
环境准备就绪,安装过程其实简单得超乎想象。我们分两步走,确保基础编译环境和PCL都能正确安装。
4.1 安装基础编译工具链
虽然我们的目标是PCL,但很多软件在编译安装时都需要一些通用的工具,比如gcc、g++、make等。build-essential这个元包(meta-package)就包含了这一整套基础工具。先把它装上,避免后续编译测试代码时出问题:
sudo apt-get install build-essential
系统会列出将要安装的包,询问你是否继续,输入y并按回车确认。稍等片刻,基础工具就安装好了。
4.2 安装PCL开发库
最关键的一步来了,安装PCL本身:
sudo apt-get install libpcl-dev
当你输入这条命令后,apt会做以下几件聪明事:
- 分析依赖:它发现
libpcl-dev依赖于libpcl1.10(运行时库),而PCL又依赖于VTK、Boost、Eigen、FLANN等一系列库。 - 解决依赖:它会自动计算出所有这些依赖包,并形成一个完整的安装列表。
- 提示确认:在终端里,它会显示一个长长的列表,告诉你将要安装
libpcl-dev、libpcl1.10、libvtk7.1、libboost-all-dev等等几十个包,并询问“您希望继续执行吗?[Y/n]”。 - 一键安装:你只需要输入
y然后回车,apt就会自动从配置好的阿里云镜像源下载所有这些包,并按正确的顺序安装它们,处理好彼此之间的配置和链接。
这个过程完全是自动化的,你不需要手动去查找、下载、配置任何一个依赖库。这就是包管理器的魅力所在。安装完成后,PCL的头文件会被放在/usr/include/pcl-1.10/pcl/目录下,库文件会在/usr/lib/x86_64-linux-gnu/目录中。
5. 验证安装:如何确认PCL真的装好了?
安装过程没有报错,但怎么才能确信PCL已经正确安装,并且可以被我们的程序找到呢?我教你几个实用的验证方法,从简单到深入。
5.1 方法一:查询已安装的包版本
最直接的方法,就是问apt它到底给我们装了啥:
apt-cache show libpcl-dev | grep Version
或者,用dpkg命令查看已安装包的具体信息:
dpkg -l | grep libpcl
这条命令会列出所有包含libpcl字样的已安装包。你应该能看到libpcl-dev和libpcl1.10这两个包,以及它们确切的版本号。这证明了PCL的软件包确实已经存在于你的系统中。
5.2 方法二:检查关键的头文件和库路径
光有包还不够,我们得确认开发文件(头文件)和链接库(.so文件)都就位了。
检查头文件:
ls /usr/include/pcl-1.10/pcl/
如果这个目录存在,并且里面充满了.h、.hpp头文件(比如point_cloud.h、io/pcd_io.h等),那说明头文件安装正确。
检查库文件:
ls /usr/lib/x86_64-linux-gnu/libpcl*
你会看到一系列以libpcl_开头的动态库文件,例如libpcl_common.so、libpcl_io.so、libpcl_filters.so等。这些就是编译程序时需要链接的库。
5.3 方法三:编写一个最简单的测试程序(强烈推荐)
前两种方法是“静态”检查,而编译运行一个实际程序是“动态”的终极验证。它能同时测试编译器能否找到头文件、链接器能否找到库、以及库本身能否正常工作。
创建一个新的C++文件,比如叫test_pcl_install.cpp:
nano test_pcl_install.cpp
将以下代码粘贴进去。这是一个最小化的PCL程序,它不依赖任何外部数据文件,仅仅创建一个空的点云对象并输出其基本信息:
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
int main() {
// 创建一个空的点云对象,其中每个点的类型是 pcl::PointXYZ (包含x, y, z坐标)
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 设置点云的一些属性
cloud->width = 100; // 点云宽度(可以理解为每行有100个点)
cloud->height = 1; // 点云高度为1,表示这是一个无组织结构的点云
cloud->is_dense = true; // 点云中所有点都是有效的(没有无穷远点或NaN点)
cloud->points.resize(cloud->width * cloud->height); // 为100个点分配空间
// 简单地为每个点赋个值(这里只是示例,实际应用中会从文件或传感器读取)
for (size_t i = 0; i < cloud->points.size(); ++i) {
cloud->points[i].x = i * 0.01f; // x坐标线性增长
cloud->points[i].y = 0.0f;
cloud->points[i].z = 0.0f;
}
// 打印点云的基本信息
std::cout << "PCL安装测试成功!" << std::endl;
std::cout << "点云创建成功,包含 " << cloud->points.size() << " 个点。" << std::endl;
std::cout << "第一个点的坐标是: ("
<< cloud->points[0].x << ", "
<< cloud->points[0].y << ", "
<< cloud->points[0].z << ")" << std::endl;
return 0;
}
保存并退出编辑器(在nano中是Ctrl+O, Ctrl+X)。
现在,尝试编译这个程序。我们需要告诉编译器去哪里找PCL的头文件和库文件。幸运的是,PCL提供了一个非常方便的工具叫pkg-config来帮我们做这件事。使用以下命令编译:
g++ test_pcl_install.cpp -o test_pcl_install $(pkg-config --cflags --libs pcl_common-1.10)
让我解释一下这个命令:
g++:C++编译器。test_pcl_install.cpp:我们的源代码文件。-o test_pcl_install:指定输出的可执行文件名为test_pcl_install。$(pkg-config --cflags --libs pcl_common-1.10):这是最关键的部分。pkg-config是一个工具,它能自动查询已安装库的编译和链接参数。pcl_common-1.10是PCL核心模块的包名。--cflags会输出包含头文件路径的编译选项(如-I/usr/include/pcl-1.10),--libs会输出链接库的选项(如-lpcl_common)。$()是命令替换,将pkg-config命令的输出结果直接插入到g++命令中。
如果PCL安装正确且pkg-config配置无误,这条命令应该能顺利执行,不会报“找不到头文件”或“未定义的引用”这类错误。
最后,运行生成的可执行文件:
./test_pcl_install
如果屏幕上打印出:
PCL安装测试成功!
点云创建成功,包含 100 个点。
第一个点的坐标是: (0, 0, 0)
那么,恭喜你!这不仅仅意味着PCL安装成功了,更意味着你的开发环境已经完全就绪,可以开始真正的点云编程之旅了。这个简单的程序验证了从包含头文件、使用PCL核心类、到编译链接的完整链条都是通畅的。
6. 进阶与排坑:你可能遇到的几个典型问题
即使按照上述步骤操作,由于系统环境的细微差异,你也可能会遇到一些问题。别担心,我把我遇到过和常见的问题都整理在这里。
6.1 找不到pkg-config的.pc文件
在执行编译测试命令时,你可能会遇到这样的错误:
Package pcl_common-1.10 was not found in the pkg-config search path.
Perhaps you should add the directory containing `pcl_common-1.10.pc'
to the PKG_CONFIG_PATH environment variable?
问题原因:pkg-config工具需要找到对应的.pc文件来获取库信息。PCL的.pc文件通常安装在/usr/lib/pkgconfig/或/usr/lib/x86_64-linux-gnu/pkgconfig/目录下。有时安装后,这个路径没有被自动加入到pkg-config的搜索路径中。
解决方案:手动将该目录添加到环境变量。你可以临时添加(仅对当前终端有效):
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
然后再次尝试编译命令。
为了永久生效,可以将这行命令添加到你的shell配置文件中(如~/.bashrc或~/.zshrc):
echo 'export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH' >> ~/.bashrc
source ~/.bashrc
6.2 编译时链接错误(undefined reference)
如果你的测试程序编译通过了,但在链接阶段报错,提示一大堆undefined reference to ...,这通常意味着链接器没有找到具体的库实现。
问题原因:pkg-config可能没有包含所有必需的PCL模块。我们的测试程序只用了pcl_common(核心模块),但如果你将来用到IO、滤波、特征等模块,就需要链接对应的库。
解决方案:明确指定所有用到的模块。例如,如果你用了pcl::io::loadPCDFile函数,就需要链接pcl_io-1.10。更通用的方法是,如果你不确定,可以链接PCL的绝大多数常用模块:
g++ your_program.cpp -o your_program $(pkg-config --cflags --libs pcl_common-1.10 pcl_io-1.10 pcl_filters-1.10)
或者,查阅PCL官方文档,看你使用的类属于哪个模块,然后链接对应的库。
6.3 运行时找不到动态库(libpcl_xxx.so.1.10: cannot open shared object file)
程序编译成功了,但运行时出现类似错误:
error while loading shared libraries: libpcl_common.so.1.10: cannot open shared object file: No such file or directory
问题原因:系统运行时链接器(ld)不知道去哪里找PCL的库文件。虽然库安装在/usr/lib/x86_64-linux-gnu/,但有时需要刷新一下动态库的缓存。
解决方案:执行以下命令,更新动态链接库的缓存:
sudo ldconfig
这个命令会扫描/etc/ld.so.conf配置文件中指定的目录(通常包括/usr/lib和/usr/local/lib)以及它们的子目录,并创建一个缓存文件,加速运行时库的查找。执行完毕后,再运行你的程序试试。
6.4 想用CMake管理项目怎么办?
上面的测试我们用命令行直接编译。实际项目中,大家更常用CMake来管理。这里给出一个对应的、最简单的CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.10)
project(MyPCLProject)
# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
# 查找PCL库,REQUIRED表示必须找到,否则报错
find_package(PCL 1.10 REQUIRED COMPONENTS common io) # 按需添加你需要的组件,如filters, segmentation等
# 包含PCL的头文件目录
include_directories(${PCL_INCLUDE_DIRS})
# 添加你的可执行文件
add_executable(test_pcl_cmake test_pcl_install.cpp) # 假设源文件同名
# 将PCL的库链接到你的可执行文件
target_link_libraries(test_pcl_cmake ${PCL_LIBRARIES})
把这个CMakeLists.txt文件放在和你的.cpp源文件同一个目录。然后在该目录下执行:
mkdir build && cd build
cmake ..
make
./test_pcl_cmake
CMake的find_package(PCL)命令会自动处理所有复杂的路径和依赖,是更专业、更推荐的项目管理方式。
7. 安装之后:下一步可以做什么?
环境搭好了,验证也通过了,接下来才是真正有趣的开始。PCL 1.10这个稳定的版本为你打开了一扇通往三维视觉世界的大门。我建议你可以从以下几个方向开始探索:
首先,跑通官方教程。PCL官网和其GitHub仓库里有很多示例代码(Tutorials)。从最简单的“如何读写PCD文件”开始,把示例代码下载下来,在你的新环境里编译运行。看到第一个点云被加载并显示出来,那种成就感是实实在在的。
然后,动手处理自己的数据。如果你有深度相机(如Kinect、RealSense)或者激光雷达数据,尝试用PCL的IO模块读取它们。如果没有,网络上有大量公开的点云数据集(比如斯坦福的3D扫描模型)。试着对点云进行下采样(滤波)、计算法线、做平面分割(RANSAC)等基本操作。每成功实现一个算法,你对PCL的理解就会加深一层。
别忘了善用工具。PCL自带了一个非常强大的可视化工具pcl_viewer。你可以通过sudo apt-get install pcl-tools来安装它。在终端里直接用pcl_viewer your_pointcloud.pcd命令就能查看点云,支持旋转、缩放、测量,是调试和观察结果的利器。
最后,深入源码和社区。当你对API熟悉后,可以偶尔翻看一下PCL头文件里的注释,或者去GitHub上看看相关模块的源码实现(虽然是通过apt安装,但源码包libpcl-dev通常也包含了可供阅读的头文件)。遇到棘手的问题,PCL的官方邮件列表和GitHub Issues是寻找答案的好地方。记住,环境搭建只是第一步,真正的乐趣在于用这个强大的工具去解决实际问题,无论是做机器人导航、三维重建,还是简单的点云数据分析。
311



被折叠的 条评论
为什么被折叠?



