1. PCL 1.12.0开发环境搭建前的准备
第一次接触点云库(PCL)的开发者可能会被繁琐的环境配置劝退,特别是当需要将PCL 1.12.0与VS2019搭配使用时。我在实际项目中多次配置过这个环境,踩过不少坑,也总结出了一些经验。下面我会详细讲解整个配置过程,帮你避开那些常见的"雷区"。
首先需要明确的是,PCL是一个庞大的开源项目,它依赖多个第三方库,比如Boost、VTK、FLANN等。这意味着在安装PCL时,实际上是在安装一个"全家桶"。我建议在开始前先检查你的系统配置:
- 操作系统:Windows 10 64位(推荐版本1903或更高)
- 硬盘空间:至少预留10GB空间(PCL本身约3GB,加上依赖库和调试符号)
- 内存:8GB以上(处理点云数据时内存消耗较大)
- 显卡:支持OpenGL 3.0及以上(可视化功能需要)
注意:虽然PCL 1.12.0理论上支持VS2017和VS2019,但我强烈建议使用VS2019,因为它在C++标准支持和调试工具方面更加完善。
2. PCL 1.12.0的下载与安装
2.1 获取安装文件
PCL官方在GitHub上提供了预编译的Windows版本,这对新手来说是个福音。你需要下载两个关键文件:
- 主安装程序:PCL-1.12.0-AllInOne-msvc2019-win64.exe
- 调试符号文件:pcl-1.12.0-rc1-pdb-msvc2019-win64.zip
这两个文件都可以在PCL的GitHub Release页面找到。下载时要注意选择与VS2019匹配的msvc2019版本,不要误下msvc2017的版本,否则后续会出现兼容性问题。
2.2 安装过程详解
双击安装程序后,你会看到一个标准的Windows安装向导。这里有几个关键点需要注意:
- 安装路径:建议保持默认的"C:\Program Files\PCL 1.12.0"。如果修改路径,后续的所有配置都需要相应调整,容易出错。
- 组件选择:AllInOne安装包已经包含了所有必要组件,不需要额外勾选。
- 管理员权限:安装过程中可能会弹出UAC提示,需要点击"是"授权。
安装完成后,解压之前下载的pdb调试符号文件,将其中的所有文件复制到PCL安装目录下的bin文件夹中(通常是C:\Program Files\PCL 1.12.0\bin)。这一步很多人会忽略,但它在调试时非常重要,能让你在崩溃时看到具体的堆栈信息。
3. 系统环境变量配置
3.1 添加Path环境变量
PCL依赖多个动态链接库(DLL),为了让系统能找到这些库,需要将相关路径添加到Path环境变量中。具体步骤如下:
- 右键"此电脑" → 属性 → 高级系统设置 → 环境变量
- 在系统变量中找到Path,点击编辑
- 添加以下8条路径(注意根据你的实际安装路径调整):
C:\Program Files\OpenNI2\Lib C:\Program Files\OpenNI2\Redist C:\Program Files\OpenNI2\Tools C:\Program Files\PCL 1.12.0\bin C:\Program Files\PCL 1.12.0\3rdParty\Boost\lib C:\Program Files\PCL 1.12.0\3rdParty\FLANN\bin C:\Program Files\PCL 1.12.0\3rdParty\Qhull\bin C:\Program Files\PCL 1.12.0\3rdParty\VTK\bin重要提示:修改环境变量后,需要注销当前用户并重新登录才能使更改生效。单纯重启资源管理器或者开新的CMD窗口可能不够。
3.2 验证环境变量
配置完成后,可以通过以下方法验证:
- 打开新的CMD窗口
- 输入
echo %PATH%查看是否包含新增的路径 - 尝试直接运行PCL提供的工具,如
pcl_viewer.exe,看是否能正常启动
4. VS2019项目配置
4.1 创建新项目与基本设置
在VS2019中创建一个新的C++空项目,然后进行以下基本配置:
- 解决方案平台选择"x64"(PCL不支持32位)
- 配置选择"Release"(Debug配置需要额外的调试库)
- 在项目属性中,将C++语言标准设置为"ISO C++17标准"
4.2 配置包含目录和库目录
为了能让编译器找到PCL的头文件和库文件,需要在项目属性中进行如下设置:
- 打开"属性管理器"(视图 → 其他窗口 → 属性管理器)
- 右键"Release|x64",选择"添加新项目属性表",命名为"PCL 1.12.0 Release x64.props"
- 配置包含目录(VC++目录 → 包含目录):
C:\Program Files\PCL 1.12.0\include\pcl-1.12 C:\Program Files\PCL 1.12.0\3rdParty\Boost\include\boost-1_76 C:\Program Files\PCL 1.12.0\3rdParty\Eigen\eigen3 C:\Program Files\PCL 1.12.0\3rdParty\FLANN\include C:\Program Files\PCL 1.12.0\3rdParty\Qhull\include C:\Program Files\OpenNI2\Include C:\Program Files\PCL 1.12.0\3rdParty\VTK\include\vtk-9.0- 配置库目录(VC++目录 → 库目录):
C:\Program Files\PCL 1.12.0\lib C:\Program Files\PCL 1.12.0\3rdParty\Boost\lib C:\Program Files\PCL 1.12.0\3rdParty\FLANN\lib C:\Program Files\OpenNI2\Lib C:\Program Files\PCL 1.12.0\3rdParty\Qhull\lib C:\Program Files\PCL 1.12.0\3rdParty\VTK\lib4.3 预处理器定义与附加依赖项
在"C/C++ → 预处理器 → 预处理器定义"中添加以下定义:
_CRT_SECURE_NO_WARNINGS _SCL_SECURE_NO_WARNINGS _SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING同时,在"C/C++ → 所有选项"中将"SDL检查"设置为"否"。
附加依赖项的配置比较繁琐,因为PCL和VTK都有大量的库文件。我建议使用以下方法批量添加:
- 打开CMD,切换到VTK的lib目录:
cd /d "C:\Program Files\PCL 1.12.0\3rdParty\VTK\lib" dir /b *.lib > VTK_lib.txt- 切换到PCL的lib目录:
cd /d "C:\Program Files\PCL 1.12.0\lib" dir /b *.lib > PCL_lib.txt然后,将生成的txt文件中的库文件名复制到"链接器 → 输入 → 附加依赖项"中。注意只需要添加Release版本的库(文件名不带"d"后缀的)。
5. 验证安装与常见问题解决
5.1 编写测试程序
创建一个简单的测试程序来验证环境是否配置成功:
#include <pcl/visualization/cloud_viewer.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main() { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建一个简单的点云 cloud->width = 100; cloud->height = 1; cloud->points.resize(cloud->width * cloud->height); for (auto& point : *cloud) { point.x = 1024 * rand() / (RAND_MAX + 1.0f); point.y = 1024 * rand() / (RAND_MAX + 1.0f); point.z = 1024 * rand() / (RAND_MAX + 1.0f); } // 可视化 pcl::visualization::CloudViewer viewer("Simple Cloud Viewer"); viewer.showCloud(cloud); while (!viewer.wasStopped()) {} return 0; }5.2 常见错误与解决方案
LNK2019: 无法解析的外部符号
- 原因:通常是附加依赖项没有正确配置或库路径不对
- 解决:检查库目录设置,确保所有需要的lib文件都已添加
找不到DLL
- 原因:系统找不到PCL的运行时库
- 解决:确认Path环境变量已正确设置,并包含PCL的bin目录
运行时崩溃
- 原因:可能是Debug和Release版本混用
- 解决:确保所有配置一致使用Release版本
OpenNI2.dll缺失
- 原因:OpenNI2没有正确安装
- 解决:检查PCL安装目录下是否有OpenNI2文件夹,并确认其路径已加入Path
在实际项目中,我还遇到过由于Windows SDK版本不匹配导致的问题。如果遇到奇怪的编译错误,可以尝试在项目属性中明确指定Windows SDK版本,而不是使用"最新"。