
1. 为什么2024年还有人折腾VS2013配PCL先把话说在前头如果你现在打开搜索引擎搜“VS2013配置PCL”大概率会看到两种声音。一种是“都什么年代了还用VS2013”另一种是“兄弟我也是项目锁死在VS2013了”。我属于后者而且前后帮人配过不下十次从Win7到Win10从PCL 1.6到1.8.1踩过的坑能写满两页A4纸。这个组合为什么到现在还有需求核心原因就一个存量项目的工具链锁定。很多工业视觉、逆向工程、三维扫描相关的老项目当年就是基于VS2013 PCL 1.7.x/1.8.x搭起来的编译环境、第三方库、甚至某些硬件SDK都绑死了这个版本。你贸然升级到VS2019或者VS2022轻则编译报错几百个重则整个点云处理管线跑不起来。所以这不是“怀旧”是“保命”。PCLPoint Cloud Library本身是个庞大的C模板库点云滤波、配准、分割、曲面重建、可视化全都有。它依赖Boost、Eigen、FLANN、VTK、Qhull这一大串第三方库版本之间的兼容性极其敏感。VS2013对应的是MSVC 12.0编译器PCL官方从1.7.0开始提供MSVC 2013的All-in-one安装包一直到1.8.1都还有支持。再往后1.9.x就只给VS2015了。所以VS2013 PCL 1.8.1基本是这个组合的天花板。这篇文章我打算把整个流程拆透从安装包怎么选、VS2013装的时候哪些组件必须勾、PCL的All-in-one和单独配置两条路怎么走、环境变量和VS工程属性怎么设、PCD文件包怎么用起来、最后跑一个完整的读写可视化Demo。中间会穿插大量我实际踩过的坑比如OpenNI2的路径问题、VTK的DLL缺失、Debug和Release混用导致的诡异崩溃等等。目标很明确你照着做能跑通能少走弯路。提示本文涉及的安装包和文件包请通过正规渠道获取注意核对文件完整性。所有操作在本地离线环境完成不涉及任何网络代理配置。2. 安装包与文件包的准备清单2.1 VS2013安装程序的选择与版本差异VS2013的安装程序有好几个版本Ultimate、Premium、Professional、Community。对于PCL开发来说Community版完全够用它包含了完整的C编译器和MFC支持。但如果你手头只有Ultimate的镜像也没问题功能只多不少。关键点在于VS2013的安装包分“带Update”和“不带Update”的。原始RTM版本是12.0.21005.1后面有Update 1到Update 5。强烈建议用Update 512.0.40629.00因为它修复了大量C编译器的bug尤其是模板相关的。PCL大量使用C11模板元编程RTM版本编译某些头文件时会直接内部错误。我最早用RTM版编PCL的pcl::search::KdTree就遇到过编译器崩溃换成Update 5后一次通过。安装的时候工作负载选择“自定义”必须勾选的组件编程语言 → Visual C → Visual C 2013 编译器编程语言 → Visual C → Microsoft Foundation Classes (MFC)Windows 和 Web 开发 → 通用 Windows 应用开发工具可选但有些SDK依赖常用工具 → Visual Studio 2013 更新程序注意不要勾选“Blend for Visual Studio”和“Silverlight”这些无关组件装了只会拖慢启动速度。另外安装路径不要带中文和空格默认的C:\Program Files (x86)\Microsoft Visual Studio 12.0就很好。我见过有人装在D:\我的项目\VS2013下面结果CMake生成时路径解析出错排查了半天。2.2 PCL安装程序的两种形态All-in-one vs 单独编译PCL官方为Windows提供的安装包有两种类型文件名示例包含内容适用场景All-in-onePCL-1.8.1-AllInOne-msvc2013-win64.exePCL核心库 Boost Eigen FLANN VTK Qhull OpenNI2快速上手推荐单独库各第三方库独立安装包需要自己逐个下载配置需要特定版本组合时All-in-one是绝大多数人的选择它把依赖都打包好了安装完只需要配环境变量和VS属性。但要注意All-in-one安装时会让你选择是否安装OpenNI2这个组件默认路径是C:\Program Files\OpenNI2而PCL的配置里期望它在3rdParty\OpenNI2下面。这就是第一个大坑后面会详细讲。PCL版本选择上1.8.1是VS2013的最后一个官方支持版本。1.8.0有个已知的VTK可视化bug1.7.2缺少某些配准算法。所以直接上1.8.1。2.3 PCD文件包的用途与内容结构PCDPoint Cloud Data是PCL的原生点云格式分ASCII和Binary两种编码。所谓的“PCD文件包”通常是一批示例点云用来测试环境是否配好。常见的包括bunny.pcd斯坦福兔子经典测试模型table_scene_lms400.pcd桌面场景带噪声适合滤波测试room_scan.pcd室内扫描点数量大测试内存和性能car.pcd车辆点云用于配准实验这些文件包一般从PCL官方示例数据或者某些教程配套资源里来。拿到之后不要放在中文路径下PCL的io::loadPCDFile对非ASCII路径支持很差会直接返回-1。我一般放在D:\PCL_Data\这种纯英文短路径下。提示如果你手头的PCD文件包是压缩包解压时注意不要产生嵌套目录比如pcd_data\pcd_data\bunny.pcd代码里写路径时容易搞错。3. VS2013安装中的关键勾选项与验证3.1 安装过程中的组件取舍逻辑VS2013安装程序启动后选择“自定义”安装。这里有个细节如果你之前装过VS2010或VS2012安装程序可能会提示升级或并存。我的建议是如果只是为PCL用直接全新安装VS2013不要和旧版本混在一起。MSVC的编译器版本虽然不同但环境变量VS120COMNTOOLS和VCINSTALLDIR可能会冲突。必须勾选的组件清单Visual C 2013 编译器核心不选这个等于白装Microsoft Foundation Classes (MFC)PCL的某些可视化模块间接依赖Windows SDK 8.1VS2013默认带的是8.1PCL的VTK模块需要Visual Studio 2013 更新程序用于后续打Update 5补丁不需要的组件Blend for Visual Studio做WPF动画用的跟PCL无关Silverlight已经淘汰的技术LightSwitch同样淘汰SQL Server Data Tools除非你要做数据库安装过程大概20-40分钟取决于磁盘速度。装完后先别急着打开VS去控制面板确认一下“Microsoft Visual C 2013 Redistributable”是否已经安装。如果没有手动装一下否则后面运行PCL程序会提示缺少msvcr120.dll。3.2 安装完成后的环境自检装完VS2013后做三个检查检查一编译器版本。打开“VS2013 开发人员命令提示”输入cl应该输出类似Microsoft (R) C/C Optimizing Compiler Version 18.00.40629 for x64版本号18.00.40629就是Update 5。如果是18.00.21005说明还是RTM版需要打补丁。检查二环境变量。在命令行输入echo %VS120COMNTOOLS%应该输出C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\。如果为空说明安装时没注册环境变量需要手动添加。检查三MFC是否存在。去C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc目录下看看有没有include和lib文件夹。没有的话说明MFC组件没勾选需要重新运行安装程序修改。注意如果你用的是Windows 10VS2013安装程序可能会提示“此程序兼容性有问题”直接忽略以管理员身份运行即可。Win10下VS2013能正常工作只是安装界面有点老。4. PCL All-in-one安装与路径陷阱4.1 安装过程中的OpenNI2路径问题运行PCL-1.8.1-AllInOne-msvc2013-win64.exe安装向导会依次让你选择PCL主安装路径默认C:\Program Files\PCL 1.8.1第三方库路径默认C:\Program Files\PCL 1.8.1\3rdPartyOpenNI2的安装路径默认C:\Program Files\OpenNI2第三个就是坑。PCL的CMake配置文件里OpenNI2的搜索路径写死为${PCL_ROOT}/3rdParty/OpenNI2。如果你按默认装到C:\Program Files\OpenNI2后面在VS里配置时pcl_io模块会找不到OpenNI2的头文件和库链接时报LNK2019: 无法解析的外部符号。解决方案有两个方案A推荐安装时手动把OpenNI2的路径改成C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2方案B装完后把C:\Program Files\OpenNI2整个文件夹复制到C:\Program Files\PCL 1.8.1\3rdParty\下面并改名为OpenNI2我一般用方案A省得后面忘了。如果你已经装完了才发现这个问题用方案B补救也来得及。4.2 环境变量的配置细节All-in-one装完后需要手动添加环境变量。右键“此电脑” → 属性 → 高级系统设置 → 环境变量。系统变量Path中添加C:\Program Files\PCL 1.8.1\bin C:\Program Files\PCL 1.8.1\3rdParty\VTK\bin C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2\Tools C:\Program Files\PCL 1.8.1\3rdParty\FLANN\bin新建系统变量PCL_ROOT C:\Program Files\PCL 1.8.1这里有个细节Path的顺序很重要。如果系统里之前装过其他版本的VTK或者OpenNI它们的路径可能排在前面导致加载了错误的DLL。我建议把PCL相关的路径移到Path列表的最前面。另外3rdParty\OpenNI2\Tools这个路径是给OpenNI2的设备驱动用的如果你不用Kinect或者Xtion这类深度相机可以不添加。但加上没坏处。4.3 验证安装是否成功的命令行测试环境变量配好后重启命令行重要否则Path不生效然后输入pcl_viewer如果弹出一个小窗口标题是“PCL Viewer”说明PCL的运行时环境没问题。如果提示“不是内部或外部命令”检查Path里有没有C:\Program Files\PCL 1.8.1\bin。再测试一下PCD文件读取pcl_viewer D:\PCL_Data\bunny.pcd如果能看到兔子点云说明IO模块和可视化模块都正常。如果报错“Failed to find match for field x”说明PCD文件格式有问题换一个文件试试。注意pcl_viewer在PCL 1.8.1里是pcl_viewer.exe有些版本叫pcl_viewer_release.exe。如果找不到去bin目录下看看实际文件名。5. VS2013工程属性配置的完整流程5.1 新建工程与平台选择打开VS2013新建一个“Win32控制台应用程序”命名为PCLTest。在向导里选择“空项目”不要勾选“预编译头”因为PCL的头文件里有些和预编译头冲突。关键平台选择x64。PCL 1.8.1的All-in-one只有64位版本如果你用Win32平台编译链接时会报“模块计算机类型x64与目标计算机类型x86冲突”。在VS顶部的工具栏里把“解决方案平台”从Win32改成x64。如果没有x64选项去“配置管理器”里新建一个。5.2 包含目录与库目录的填写规则右键工程 → 属性 → 配置属性 → VC目录。包含目录添加C:\Program Files\PCL 1.8.1\include\pcl-1.8 C:\Program Files\PCL 1.8.1\3rdParty\Boost\include\boost-1_64 C:\Program Files\PCL 1.8.1\3rdParty\Eigen\eigen3 C:\Program Files\PCL 1.8.1\3rdParty\FLANN\include C:\Program Files\PCL 1.8.1\3rdParty\VTK\include\vtk-7.0 C:\Program Files\PCL 1.8.1\3rdParty\Qhull\include C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2\Include库目录添加C:\Program Files\PCL 1.8.1\lib C:\Program Files\PCL 1.8.1\3rdParty\Boost\lib C:\Program Files\PCL 1.8.1\3rdParty\FLANN\lib C:\Program Files\PCL 1.8.1\3rdParty\VTK\lib C:\Program Files\PCL 1.8.1\3rdParty\Qhull\lib C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2\Lib这里有个版本号陷阱Boost的目录名是boost-1_64VTK是vtk-7.0不同PCL版本对应的第三方库版本号不同。如果你装的是PCL 1.7.2Boost可能是boost-1_58VTK是vtk-6.2。一定要去实际目录下看一眼文件夹名字不要照抄网上的教程。5.3 预处理器定义与链接器输入在“C/C → 预处理器 → 预处理器定义”中添加_CRT_SECURE_NO_WARNINGS _SCL_SECURE_NO_WARNINGS这两个宏是为了屏蔽PCL头文件里的一些安全警告不加的话编译时会有大量C4996警告虽然不影响运行但看着烦。在“链接器 → 输入 → 附加依赖项”中添加需要的lib文件。注意Debug和Release要分开配Debug版pcl_common_debug.lib pcl_io_debug.lib pcl_visualization_debug.lib pcl_search_debug.lib pcl_kdtree_debug.lib pcl_filters_debug.lib pcl_features_debug.lib pcl_registration_debug.lib pcl_segmentation_debug.lib pcl_surface_debug.libRelease版pcl_common.lib pcl_io.lib pcl_visualization.lib pcl_search.lib pcl_kdtree.lib pcl_filters.lib pcl_features.lib pcl_registration.lib pcl_segmentation.lib pcl_surface.lib注意PCL的lib文件命名规则是模块名_debug.lib对应Debug模块名.lib对应Release。如果你在Debug模式下链接了Release的lib会出现“LNK2038: 检测到_RuntimeLibrary的不匹配”错误。这个坑我踩过排查了一下午才发现是配置管理器里Debug和Release搞混了。5.4 运行时DLL缺失的排查方法编译通过后运行程序如果提示“找不到xxx.dll”用Dependencies工具或者VS自带的dumpbin /dependents查看exe依赖哪些DLL。常见的缺失缺失DLL来源解决方案pcl_common.dllPCL bin目录确认Path包含PCL 1.8.1\binvtkCommonCore-7.0.dllVTK bin目录确认Path包含3rdParty\VTK\binboost_system-vc120-mt-1_64.dllBoost lib目录确认Path包含3rdParty\Boost\libOpenNI2.dllOpenNI2 Tools目录确认Path包含3rdParty\OpenNI2\Toolsmsvcr120.dllVS2013运行时安装VC 2013 Redistributable最省事的办法把上述所有bin目录下的DLL复制到exe所在目录。但这样不优雅还是配Path比较好。6. 用PCD文件包跑通第一个点云程序6.1 读取与可视化PCD文件的完整代码新建一个main.cpp写入以下代码#include iostream #include pcl/io/pcd_io.h #include pcl/point_types.h #include pcl/visualization/cloud_viewer.h int main(int argc, char** argv) { // 定义点云类型 pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); // 读取PCD文件 if (pcl::io::loadPCDFilepcl::PointXYZ(D:\\PCL_Data\\bunny.pcd, *cloud) -1) { PCL_ERROR(Couldnt read file bunny.pcd \n); return (-1); } std::cout Loaded cloud-width * cloud-height data points from bunny.pcd with the following fields: std::endl; // 打印前10个点的坐标 for (size_t i 0; i 10; i) std::cout cloud-points[i].x cloud-points[i].y cloud-points[i].z std::endl; // 可视化 pcl::visualization::CloudViewer viewer(PCL Viewer); viewer.showCloud(cloud); while (!viewer.wasStopped()) { // 等待窗口关闭 } return (0); }这段代码做了三件事加载PCD文件、打印前10个点的坐标、用可视化窗口显示点云。CloudViewer是PCL里最简单的可视化类适合快速验证。6.2 编译链接时的常见报错与修复报错1fatal error C1083: 无法打开包括文件: pcl/io/pcd_io.h说明包含目录没配好。检查C:\Program Files\PCL 1.8.1\include\pcl-1.8下面有没有pcl文件夹。如果没有说明PCL安装不完整重新安装。报错2LNK1104: 无法打开文件 pcl_common_debug.lib库目录没配好或者lib文件名不对。去C:\Program Files\PCL 1.8.1\lib下面看看实际有哪些lib文件。有些版本的Debug lib叫pcl_commond.lib少个e这是历史遗留问题。报错3LNK2019: 无法解析的外部符号 public: virtual __cdecl pcl::visualization::CloudViewer::~CloudViewer(void)链接器输入里少了pcl_visualization_debug.lib。加上即可。报错4程序运行后闪退没有任何输出可能是PCD文件路径不对。把路径改成绝对路径并且用双反斜杠\\或者正斜杠/。另外确认PCD文件不是空的用记事本打开看看有没有DATA ascii或者DATA binary头。6.3 点云数据的简单滤波与保存跑通读取之后可以试试滤波和保存。下面这段代码对点云做体素栅格降采样然后保存为新的PCD文件#include pcl/filters/voxel_grid.h // 创建滤波对象 pcl::VoxelGridpcl::PointXYZ sor; sor.setInputCloud(cloud); sor.setLeafSize(0.01f, 0.01f, 0.01f); // 1cm的体素 pcl::PointCloudpcl::PointXYZ::Ptr cloud_filtered(new pcl::PointCloudpcl::PointXYZ); sor.filter(*cloud_filtered); std::cout PointCloud after filtering: cloud_filtered-width * cloud_filtered-height data points. std::endl; // 保存 pcl::io::savePCDFileASCII(bunny_filtered.pcd, *cloud_filtered);setLeafSize的参数是体素栅格的边长单位是米。0.01就是1厘米。这个值越小降采样后点越多计算越慢。对于兔子这种小模型0.005到0.01比较合适。对于室内场景0.05到0.1更合理。注意savePCDFileASCII保存的是文本格式文件体积大但可读。如果要节省空间用savePCDFileBinary。但Binary格式在不同字节序的机器上可能不兼容一般本地用没问题。7. 那些年我踩过的坑与排查思路7.1 Debug与Release混用导致的诡异崩溃这个坑我印象最深。有一次在Debug模式下编译通过运行到viewer.showCloud(cloud)时直接崩溃没有任何错误信息。用调试器跟进去发现崩在VTK的vtkRenderer::AddActor里面。排查过程先怀疑是点云数据有问题换了个PCD文件还是崩。然后怀疑是VTK版本不兼容重装了VTK还是崩。最后用dumpbin /dependents查看exe依赖的DLL发现它加载的是vtkCommonCore-7.0.dllRelease版而我的工程是Debug模式应该加载vtkCommonCore-7.0d.dllDebug版。根因Path环境变量里VTK\bin目录下同时有Debug和Release的DLL系统按文件名匹配优先找到了Release版。而PCL的Debug lib链接的是Debug版VTK两者ABI不兼容导致崩溃。解决方案把VTK\bin下的Debug DLL和Release DLL分开放或者干脆在Debug模式下把Release DLL临时改名。更彻底的办法是在工程属性里把“调试 → 环境”设置为PATHC:\Program Files\PCL 1.8.1\3rdParty\VTK\bin\debug;%PATH%强制优先加载Debug DLL。7.2 OpenNI2路径错误引发的链接失败前面提过OpenNI2的默认安装路径问题。这里补充一个细节即使你把OpenNI2复制到了3rdParty下面VS工程里的库目录如果还指向C:\Program Files\OpenNI2\Lib链接时仍然会报错。因为PCL的pcl_io模块在编译时记录的OpenNI2路径是${PCL_ROOT}/3rdParty/OpenNI2运行时和链接时都按这个路径找。排查方法在VS里右键pcl_io_debug.lib→ 属性 → 查看“附加依赖项”里有没有OpenNI2的lib。如果有说明PCL在编译时已经绑定了路径。你只需要保证3rdParty\OpenNI2下面有对应的Include和Lib文件夹即可。7.3 PCD文件路径中的中文与空格问题PCL的loadPCDFile底层用的是std::ifstream在Windows上对宽字符路径支持不好。如果你的PCD文件放在D:\点云数据\bunny.pcd即使路径存在也会返回-1。解决方案要么把文件移到纯英文路径要么用boost::filesystem做路径转换。但后者比较麻烦不如直接改路径。我一般建一个D:\PCL_Data\目录所有测试数据都放这里。另外路径里的空格也会有问题。C:\Program Files\PCL 1.8.1\这个路径本身带空格但PCL的安装程序已经处理好了。你自己放数据的时候避免用带空格的目录名。7.4 内存泄漏与智能指针的使用建议PCL大量使用boost::shared_ptr后来改成std::shared_ptr。如果你手动new了一个点云对象忘记delete就会内存泄漏。但更常见的问题是循环引用两个shared_ptr互相指向对方导致引用计数永远不为零。建议尽量用PCL提供的::Ptr类型别名比如pcl::PointCloudpcl::PointXYZ::Ptr。创建对象时用new但不要手动delete交给智能指针管理。如果需要在多个函数间传递点云用const引用或者Ptr拷贝不要传裸指针。// 推荐 pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); // 不推荐 pcl::PointCloudpcl::PointXYZ* cloud new pcl::PointCloudpcl::PointXYZ(); // ... 后面忘了delete8. 从能跑到好用性能与工程化建议8.1 编译速度优化预编译头与并行编译PCL的头文件非常庞大一个简单的#include pcl/visualization/cloud_viewer.h就会拖入上百个VTK头文件。全量编译一次可能要几分钟。优化手段开启多处理器编译工程属性 → C/C → 常规 → 多处理器编译 → 是(/MP)使用预编译头把常用的PCL头文件放到stdafx.h里然后开启预编译头。但注意PCL的某些模板头文件和预编译头有冲突需要测试。减少不必要的包含只包含用到的模块不要#include pcl/pcl.h这种全量包含。我实测下来开启/MP后编译时间从3分钟降到1分钟左右。预编译头能再降到30秒但配置起来麻烦适合大型项目。8.2 点云数据量增大后的内存管理当点云点数超过百万级时内存占用会急剧上升。一个PointXYZ是16字节4个float但实际对齐后是16字节100万个点就是16MB。加上法线、颜色、描述子轻松上GB。建议读取大点云后立即做降采样减少后续处理的数据量使用pcl::PointCloudpcl::PointXYZ::Ptr而不是栈上对象避免拷贝及时释放不再使用的点云cloud-clear(); cloud-points.shrink_to_fit();如果内存实在不够考虑分块处理用pcl::PCDReader的read函数按偏移量读取部分数据8.3 将配置固化属性表与CMake的取舍每次新建工程都要手动配一遍包含目录、库目录、附加依赖项非常繁琐。有两种固化方案方案AVS属性表.props。在属性管理器里新建一个属性表把所有配置写进去以后新建工程直接添加这个属性表即可。优点是简单缺点是属性表文件在不同机器上路径可能不同需要手动改。方案BCMake。写一个CMakeLists.txt用find_package(PCL 1.8 REQUIRED)自动查找PCL。优点是跨平台、路径自动解析缺点是需要额外学习CMake语法而且VS2013对CMake的支持不如新版VS。我个人的选择是小项目用属性表大项目用CMake。属性表配置一次导出成.props文件以后直接导入。CMake适合需要频繁切换编译环境或者多人协作的场景。cmake_minimum_required(VERSION 3.1) project(PCLTest) find_package(PCL 1.8 REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_executable(PCLTest main.cpp) target_link_libraries(PCLTest ${PCL_LIBRARIES})这段CMakeLists.txt在VS2013下用CMake 3.1以上版本生成工程能自动配好所有路径。但要注意CMake生成的工程默认是Win32平台需要手动改成x64。8.4 版本锁定与团队协作的注意事项如果你在团队里推广这套环境一定要把安装包和配置步骤文档化。我见过太多因为版本不一致导致的“在我机器上能跑”问题。建议做法把VS2013安装包、PCL All-in-one安装包、PCD测试文件包放在共享目录写一个setup.md记录每一步的勾选项和路径导出一份配好的VS属性表放在共享目录在代码仓库的README里注明环境要求VS2013 Update 5 PCL 1.8.1 x64另外不要用“最新版”这种模糊描述。PCL 1.8.1就是1.8.1Boost 1.64就是1.64。版本号写清楚省得后面扯皮。提示如果团队里有人的机器是Windows 7注意VS2013 Update 5在Win7上需要先安装.NET Framework 4.5.2。Win10则自带不用管。9. 一些零散但有用的经验补充9.1 如何快速判断PCD文件是ASCII还是Binary用记事本打开PCD文件看头部有没有DATA ascii或者DATA binary。ASCII格式可以直接看到坐标数值Binary格式则是乱码。另外ASCII格式的文件体积通常是Binary的3到5倍。如果拿到一个PCD文件但不确定格式可以用pcl_viewer打开能显示就说明格式没问题。如果报错“Failed to find match for field”说明点类型不匹配比如文件里是PointXYZRGB但你用PointXYZ去读。9.2 PCL可视化窗口的交互操作CloudViewer窗口支持一些快捷键r重置视角/-放大缩小鼠标左键拖动旋转鼠标中键拖动平移鼠标滚轮缩放如果窗口一片黑可能是点云坐标范围太大或太小。按r重置视角试试。如果还是黑检查点云是否为空。9.3 点云格式转换的常见需求PCL支持多种点云格式PCD、PLY、OBJ、STL等。转换用pcl::io模块的loadPLYFile、savePLYFile等函数。但注意PLY和OBJ支持网格Mesh而PCD只支持点云。从Mesh转点云可以反过来不行。// PLY转PCD pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); pcl::io::loadPLYFile(model.ply, *cloud); pcl::io::savePCDFileBinary(model.pcd, *cloud);9.4 遇到编译器内部错误时的应对VS2013的编译器在处理某些复杂模板时可能会报fatal error C1001: 编译器中发生内部错误。这不是你的代码问题是编译器bug。应对方法尝试把出错的代码拆分成多个小函数减少模板嵌套层级升级到VS2013 Update 5如果还没升如果实在不行用VS2015编译PCL部分然后和VS2013的代码混合链接不推荐ABI可能不兼容我遇到过一次在pcl::registration::CorrespondenceEstimation里报C1001后来把#include pcl/registration/icp.h移到文件最前面就好了。编译器的头文件包含顺序有时会影响模板实例化。9.5 备份与恢复配好的环境如何迁移配好一套VS2013 PCL环境不容易建议做备份导出VS的所有设置工具 → 导入和导出设置 → 导出所选环境设置备份环境变量用set env_backup.txt导出当前命令行环境备份VS属性表把.props文件复制到安全位置记录PCL安装路径和版本号迁移到新机器时按同样的顺序安装VS2013、PCL然后导入设置和属性表。注意新机器的盘符和路径要一致否则属性表里的绝对路径会失效。如果路径不一致可以用文本编辑器批量替换.props文件里的路径。比如把C:\Program Files\PCL 1.8.1替换成D:\PCL 1.8.1。9.6 关于PCL 1.8.1之后版本的升级考量如果你哪天决定升级到PCL 1.9.x或更高需要注意PCL 1.9.x开始只支持VS2015及以上点类型系统有变化PointXYZ的内存布局可能不同某些API被标记为deprecated编译时会有大量警告VTK版本从7.0升到8.x可视化模块的接口有变动升级不是简单的替换安装包需要重新编译所有依赖PCL的代码。如果项目不急建议先在独立分支上测试确认所有功能正常后再合并。10. 写在最后关于这套老组合的几句实话VS2013 PCL 1.8.1这套组合放在今天确实不算“先进”但它稳定、资料多、坑都被踩得差不多了。对于维护存量项目的开发者来说能跑通、能编译、能出结果比什么都重要。我自己的经验是配置过程中90%的问题都出在三个地方路径不对、版本不匹配、Debug/Release混用。把这三个点盯死了剩下的就是体力活。另外不要迷信网上的“一键配置脚本”那些脚本往往针对特定机器环境换台机器就失效。老老实实按步骤配配完做备份才是正道。如果你在配置过程中遇到了本文没覆盖的问题我的建议是先用dumpbin /dependents看依赖再用Process Monitor看文件加载最后用调试器跟崩溃点。这三板斧下去大部分问题都能定位。实在不行把PCL降级到1.7.2试试那个版本对VS2013的支持更成熟只是少了几个新算法。最后提醒一句所有安装包和文件包注意从正规渠道获取核对文件哈希值避免下载到被篡改的版本。环境配置这种事安全第一。