简介:面向使用Qt与MinGW编译器进行三维点云应用开发的C++工程师,资源包完整集成了基于MinGW编译的PCL及其全部依赖库,包括Boost、Eigen、FLANN、Qhull和VTK。它有效解决了依赖库版本不匹配、编译参数繁琐等常见问题,可直接应用于点云数据读取、滤波、特征提取、表面重建与可视化渲染等场景。压缩包共2000个文件,其中1997个为hpp头文件,另外包含txt、pdf、doc格式的说明文档各1份,整体大小为151.31MB。hpp头文件覆盖各库核心接口,涵盖点云配准、分割、曲面重建等常用算法模块,便于快速查阅与调用;配套文档则梳理了依赖关系及编译配置要点,能够帮助开发者跳过耗时耗力的源码构建过程。目前已有36人学习/下载,适合具有一定C++基础、希望快速搭建PCL开发环境的中高级开发者使用,尤其适合需要避开MSVC与MinGW混用问题的工程场景。
1. 为什么明明有 MSVC 方案,还要用 MinGW 在 Windows 上硬啃 PCL
当你打开 Qt Creator,新建一个点云显示工程,选好 MinGW 64 位套件,链接 PCL 时大概率会撞上一堵墙:PCL 官网只提供 Visual Studio 预编译包,MinGW 环境下所有依赖都要自己从源码编译——boost、eigen、flann、qhull、VTK 一个都躲不掉。网上随手一搜,出来的“Windows 下配置 PCL 最全面最详细配置”教程几乎全是 VS2017 的,mingw 下的资料零零散散,版本号还对不上。
但坚持用 MinGW 的团队并不少:有人不想给 MSVC 许可付费,有人把 Linux 上的 CMake 工程直接搬到 Windows 复用,还有人就是习惯了 Qt Creator 的调试体验。这套方案能换来一个完全开源、可脚本化的 Windows 点云开发环境。本文直接给你一条“从源码把所有依赖按顺序编起来”的完整路径,包含命令、参数和这五六年反复踩过的坑。
2. 编译前的工具链对齐:MinGW 版本、CMake 生成器与依赖编译顺序
2.1 MinGW 选型:用 Qt 自带的 MinGW,还是去 mingw官网下载独立版
第一步其实不是下载源码,而是统一编译器。Qt 安装包(比如 Qt 5.15.2)自带了 MinGW 8.1.0,一般在 C:\Qt\Qt5.15.2\Tools\mingw810_64 目录下。我一般直接用这个自带的,因为 Qt 官方就是用同一套编译器构建 mingw81_64 的 Qt 库,版本匹配后“qt 编译时候 cannot find -lxxx”这类链接问题会少一半。
也有不少教程推荐去 mingw官网下载 winlibs 或 w64devkit 的独立 MinGW-w64,版本从 gcc 8 到 gcc 13 都有。独立版更干净,但要小心它在系统 PATH 里的顺序会干扰 Qt 的 qmake。你既想要高版本 gcc,又想让 Qt 找到合适的老版本库,两者经常打架。先检查现有环境:
g++ --version qmake --version看输出里的 gcc 版本号是不是和 Qt 工具链目录一致。msvc 和 mingw 区别,一句话就能说清:MSVC 的库是 COFF/PE 格式,链接器是 link.exe;MinGW 用的是 GNU 工具链,库是 .a/.dll.a 格式,两边的 C++ ABI 也不同。所以 MSVC 编译的 PCL 预编译包在 MinGW 下根本没有利用价值,这就是标题这串依赖必须走源码编译的根本原因。
2.2 CMake 生成器:为什么必须选 MinGW Makefiles
假设你已经装好 CMake 3.20+ 并加入 PATH。在 Windows 上使用 MinGW 工具链时,CMake 的生成器要显式写-G "MinGW Makefiles",而不是默认的 Visual Studio 生成器,也不是 NMake Makefiles。用错生成器后 CMake configure 虽然能过,但 build 阶段会调用 cl.exe 或 nmake,立刻暴露编译器不匹配。
我还有一个强迫症级别的习惯:整个编译过程不使用任何带空格、中文、非 ASCII 字符的路径。全盘统一在 D:\dev 下按“源码目录 + 构建目录 + 安装前缀”三件套规划。比如 D:\dev\src\eigen-3.4.0、D:\dev\build\eigen-build,安装前缀统一指向 D:\dev\pcl-deps\eigen。MinGW 的 make 对路径转义处理得很差,路径干净能省掉后续 80% 的“玄学报错”。
配置前先看一遍 CMake 缓存变量,也是个好习惯。直接cmake -LAH打印所有缓存项,能看到哪个库被找到了、哪个没找到。别一上来就闷头 build,configure 输出里那几行-- Found XXX比什么都靠谱。
2.3 依赖编译顺序:为什么 boost 必须在 flann 之前
PCL 的直接依赖是 boost、eigen、flann、qhull、VTK,但依赖之间还有二级依赖:flann 的 CMake 会调 find_package(Boost),它的多线程和文件系统模块得先编好;VTK 依赖 Qt 5 的 Gui、Widgets、OpenGL;PCL 本体最后编。我的推荐顺序:
| 顺序 | 依赖库 | 版本建议 | 编译方式 | 预计耗时(4线程) |
|---|---|---|---|---|
| 1 | eigen | 3.4.0 | header-only + cmake install | 10 分钟 |
| 2 | boost | 1.82.0 | bootstrap + b2 | 40-60 分钟 |
| 3 | flann | 1.9.2 | cmake | 10 分钟 |
| 4 | qhull | 8.0.2 | cmake | 5 分钟 |
| 5 | VTK | 9.2.6 | cmake | 40-50 分钟(裁剪后) |
| 6 | PCL | 1.14.0 | cmake | 30-50 分钟(裁剪后) |
这里把 eigen 排第一不是因为它要编译,而是 PCL 的 find_package(Eigen3) 需要它的 cmake 配置文件已经安装;把 boost 排第二是因为 flann 和 PCL 都要链接它。注意表格里 VTK 和 PCL 的耗时都标注了“裁剪”,这个坑后面专门讲——全模块编译不是不能过,是时间成本完全不合理。
一提到手动编 PCL,大家第一个反弹是 vcpkg 一条命令装完。vcpkg 确实能编出 MinGW 版本,但装下来的库版本组合是 vcpkg 定的,Qt 版本兼容性不好控制,triplet 固定为 x64-mingw 时经常和 Qt 自带的 MinGW 8.1.0 对不上。我这边用 vcpkg 试过两次都卡在 VTK 的 Qt 组件上,最后退回手动流程。手动编译看着苦,但每一步的产物、版本、路径都是自己可控的,出了问题也容易定位。
3. eigen 与 boost:一个不用编译,一个必须先编译
3.1 eigen:header-only 库也要走一遍 cmake install
eigen 是个头文件库,真正的 Eigen 头文件和少量 cmake 配置文件。有人图省事直接 include 源码目录,结果 PCL 配置时死活找不到 Eigen3_DIR。正确做法是在源码目录里跑一次安装,把 cmake 配置文件“登记”到统一前缀下:
cd D:/dev/build/eigen-build cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/dev/pcl-deps/eigen" -DCMAKE_BUILD_TYPE=Release D:/dev/src/eigen-3.4.0 cmake --build . --target install第一段是配置,第二段是安装。这里不需要先 build 再 install,target install 会自动把 Eigen 头文件和 Eigen3Config.cmake 拷到 D:/dev/pcl-deps/eigen。编译阶段什么都不生成,所以耗时基本可以忽略。CMAKE_INSTALL_PREFIX 指定安装根目录,CMAKE_BUILD_TYPE 对 header-only 库没有实际影响,但写上 Release 能让后面依赖 CMake 的链接行为更可预期。
验证安装是否成功,看两个文件:
dir D:\dev\pcl-deps\eigen\include\eigen3 dir D:\dev\pcl-deps\eigen\share\eigen3\cmake只要 Eigen3Config.cmake 存在,PCL 的配置阶段就能通过 find_package(Eigen3) 找到版本号。我在这里吃过一次亏:跳过 cmake install、直接让 PCL 指向源码的 include,CMake 确实能找到头文件,但版本号读不出来,最后只能回头补一次 install。
3.2 boost:bootstrap.bat 与 b2 的三个必调参数
boost 是这批依赖里唯一不用 CMake 的。在 D:/dev/src/boost_1_82_0 目录下,先运行 bootstrap.bat 生成 b2.exe,然后执行编译。它叫 b2,传统上叫 bjam,参数大同小异。下面这行是经过五轮验证的“最小有效配置”:
bootstrap.bat gcc .\b2 toolset=gcc address-model=64 --build-type=complete --with-filesystem --with-thread --with-date_time --with-system --with-chrono --with-atomic --with-regex install --prefix="D:/dev/pcl-deps/boost" -j 4toolset=gcc 是这行命令里最重要的参数。bootstrap 默认可能生成 msvc 工具链的描述文件,不写 toolset=gcc,编译出来的库文件名会变成 libboost_filesystem-vc143-mt-x64-1_82.lib——这是 MSVC 命名规则,MinGW 的链接器根本不认。写成 gcc 后,库名是 libboost_filesystem-mgw*-mt-x64-1_82.a,PCL 才能正常引用。
address-model=64 对应 64 位 Qt;--with- 后面的模块是 PCL 实际要用到的:filesystem、thread、system、date_time、chrono、atomic、regex,其余模块像 python、graph 不编,能省大约三分之一时间。--build-type=complete 会构建静态库和动态库两种,MinGW 下 PCL 官方用的是动态库,但编全一点后面调整链接方式时不用回头重编。-j 4 是并行度,按物理核数给,8 核可以 -j 8,注意别用超线程数,容易把机器卡死。
boost 库安装检测有两个土办法。第一是看安装目录下 include/boost/version.hpp 里的 BOOST_LIB_VERSION,第二是写一个 5 行的链接测试:
#include <boost/version.hpp> #include <iostream> int main() { std::cout << BOOST_LIB_VERSION << std::endl; return 0; }用 g++ 编一下能过,说明头文件和库路径都没问题。别小看这一步,后面 flann 配置阶段但凡报 “Boost not found” 或 “found but not compatible”,基本都是 boost 编成了 MSVC 格式。
3.3 静态库还是动态库:MinGW 下的选择逻辑
PCL 的 find_package 默认优先找动态库,也就是带 .dll 的导入库 .dll.a。boost 的 b2 install 默认把动态库装进 lib 目录,如果你偏偏只编了静态库,PCL 配置时可能报“Boost found but version mismatch”或者链接时出现一堆“undefined reference”。我建议第一遍统一走动态库,Windows 下部署也简单,exe 旁白放 dll 就行。等你想把程序拷到没装 Qt 的机器上,再单独编一套静态库也不迟。
4. flann、qhull、VTK 与 PCL 本体:四个 CMake 工程的配置与裁剪
4.1 flann:关掉三种语言绑定,让 CMake 只找到 boost
flann 1.9.2 是官方最后的 release 版本。它的 CMake 有点啰嗦,默认会去找 Matlab、Python、C# 的绑定目标,还会尝试找 HDF5,在 MinGW 环境里这些通常缺失或版本不匹配,不改开关几乎必然 configure 失败。我的固定配置:
cd D:/dev/build/flann-build cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/dev/pcl-deps/flann" -DCMAKE_BUILD_TYPE=Release -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF -DBUILD_TESTS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOC=OFF -DCMAKE_PREFIX_PATH="D:/dev/pcl-deps/boost" D:/dev/src/flann-1.9.2 cmake --build . --target install -j 4-DBUILD_MATLAB_BINDINGS=OFF 等四个选项把不相关绑定全部关掉,省去一大串依赖探测;CMAKE_PREFIX_PATH 指向 boost 安装目录,flann 的 find_package(Boost) 才会命中第 3 章编好的那套库。configure 完后注意看输出里的Found Boost,确认版本是 1.82.0 而不是系统里另一个 msvc 版本的 boost。
flann 编译产物在 install 目录下有两个分层:include/flann 是头文件,lib/libflann.dll.a 和 libflann.dll 是导入库和运行库。PCL 在配置阶段要同时用到 flann 的头文件、库文件和版本宏,所以 CMAKE_INSTALL_PREFIX 一定不能省。
4.2 qhull:三分钟编完,但默认库名容易被 PCL 认成“缺组件”
qhull 是这批依赖里最轻的,CMake 扫一眼就能过,但有个隐蔽的坑:默认编译只生成 libqhullstatic.a 和 qhull.dll,如果你打开的是 BUILD_STATIC_LIBS 选项,PCL 的 find_package(Qhull) 只会找动态库名。为了少折腾,我一般打开编译全部组件的开关,顺带设置位置无关代码:
cd D:/dev/build/qhull-build cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/dev/pcl-deps/qhull" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DQHULL_COMPILEALL=ON D:/dev/src/qhull-2020.2 cmake --build . --target install -j 4CMAKE_POSITION_INDEPENDENT_CODE=ON 是给静态库加 -fPIC,虽然 Windows/PE 下通常不需要,但 PCL 某些组件的 CMake 会按“可 PIC 静态库”来假设,打开它能避免 configure 阶段的告警。-DQHULL_COMPILEALL=ON 让 qhull 生成 libqhull_r、libqhullcpp、libqhullstatic 等全部目标,PCL 只需要 libqhull_r 和 libqhull,但全开之后更不容易遇到 “Qhull not found” 的假报错。
4.3 VTK:唯一需要 1 小时量级的依赖,用模块裁剪控制时间
VTK 是这批依赖里的大头,也是让 configure 输出直接决定 PCL 带不带可视化模块的关键。版本选 9.2.6,它对 PCL 1.14 的 Qt 组件兼容性最好。默认 CMake 会开启两三百个模块,对点云工具来说大多数用不上。我一般显式关掉全模块,只开 Rendering、Imaging、Views、Qt 这四组:
cd D:/dev/build/vtk-build cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/dev/pcl-deps/vtk" -DCMAKE_BUILD_TYPE=Release -DVTK_BUILD_ALL_MODULES=OFF -DVTK_GROUP_ENABLE_Rendering=ON -DVTK_GROUP_ENABLE_Imaging=ON -DVTK_GROUP_ENABLE_Views=ON -DVTK_GROUP_ENABLE_Qt=ON -DVTK_QT_VERSION=5 -DQT_QMAKE_EXECUTABLE="C:/Qt/Qt5.15.2/5.15.2/mingw81_64/bin/qmake.exe" -DCMAKE_PREFIX_PATH="C:/Qt/Qt5.15.2/5.15.2/mingw81_64" D:/dev/src/VTK-9.2.6 cmake --build . --target install -j 4DVTK_GROUP_ENABLE_Qt=ON 是 PCL Visualizer 嵌入 Qt 窗口的关键。VTK 9.2 默认按 Qt5 构建,-DVTK_QT_VERSION=5 再强调一次;-DQT_QMAKE_EXECUTABLE 直接指向 Qt 安装目录里的 qmake,避免 CMake 到系统 PATH 里抓到其它 Qt 版本。VTK_BUILD_ALL_MODULES=OFF 配上四组 GROUP_ENABLE,大概能把编译时间从 3 小时压到 40 分钟,模块数量从 300 压到 150 以内。如果后续遇到某些渲染功能缺失,再回来开对应的 Module_ 具体开关。
到这里,PCL 的五个前置依赖全部落位。VTK 的 configure 阶段如果看到大量 warning,不用慌,只要最终生成了 VTKConfig.cmake 就是成功。我经常用一句话判断这个库编没编好:到 install 目录的 lib 文件夹里找 vtkCommonCore-9.2.dll 和 vtkRenderingQt-9.2.dll,两个都在,说明核心和 Qt 渲染模块都齐了。
4.4 PCL 本体:七个 WITH 开关与 target 白名单
PCL 源码解压后,在 D:/dev/build/pcl-build 目录执行配置。PCL 的 CMake 会把所有依赖一次性检测完,所以 CMAKE_PREFIX_PATH 必须把第 2 到第 4 章的安装前缀全部列进去,分号分隔:
cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/dev/pcl-deps/pcl" -DCMAKE_BUILD_TYPE=Release -DWITH_VTK=ON -DWITH_BOOST=ON -DWITH_FLANN=ON -DWITH_QHULL=ON -DWITH_OPENNI=OFF -DWITH_OPENNI2=OFF -DWITH_ENSENSO=OFF -DWITH_DAVIDSDK=OFF -DWITH_DOCS=OFF -DWITH_TESTS=OFF -DPCL_BUILD_WITH_QT=ON -DPCL_QT_VERSION=5 -DCMAKE_PREFIX_PATH="D:/dev/pcl-deps/eigen;D:/dev/pcl-deps/boost;D:/dev/pcl-deps/flann;D:/dev/pcl-deps/qhull;D:/dev/pcl-deps/vtk;C:/Qt/Qt5.15.2/5.15.2/mingw81_64" D:/dev/src/pcl-pcl-1.14.0把 WITH_OPENNI、WITH_OPENNI2、WITH_ENSENSO、WITH_DAVIDSDK 全关掉。这几个是深度摄像头和体感设备的驱动接口,没有硬件时 CMake 会去找对应 dll,找不到就报错,还连累整个 configure。保持 OFF 即可,后续要用再单独开。PCL_BUILD_WITH_QT=ON 和 PCL_QT_VERSION=5 决定 PCL Visualizer 能不能内嵌到 Qt 窗口里;如果你下的 PCL 版本不认 PCL_BUILD_WITH_QT 这个开关,换成 WITH_QT=ON 是同一个意思。
配置成功后输出里的关键行大致是:
The following subsystems will be built: common, kdtree, octree, search, sample_consensus, filters, io, keypoints, registration, segmentation, features, visualization如果 visualization 不在列表里,回到上一行看 VTK 是否真的被找到。
PCL 编译最费时间的两个子系统是 io 和 visualization。直接 cmake --build . 会编全部子系统,耗时可观。我一般先跑一遍cmake --build . --target help,列出所有可用 target,然后只编自己需要的:
cmake --build . --target pcl_common pcl_kdtree pcl_search pcl_io pcl_filters pcl_visualization pcl_segmentation -j 4pcl_visualization 依赖前面几乎全部模块,编完它就等于把渲染链路验证通了。如果想做个最简单的可视化,pcl_common、pcl_io、pcl_filters、pcl_visualization 四个 target 就够。target 白名单的好处不止省时间,还能让安装目录只长成你应该使用的样子,不会塞一堆用不上的 .dll。
5. 避坑:MinGW 编译 PCL 及其依赖的常见问题与排查
5.1 配置阶段报 cannot mix incompatible Qt library (version ex50601) with this library
现象:编译任何带 Qt 的依赖(VTK 或 PCL)时,出现类似fatal: cannot mix incompatible Qt library (version ex50601) with this library的报错。
原因:你编译的库用的 Qt 头文件来自 A 版本,而链接时 PATH 里的 qwindows.dll 来自 B 版本。ex50601 表示 Qt 5.6.1,通常是系统 PATH 里混入了另一个 Qt 目录,或者 Qt 安装时勾了多个套件,MinGW 链接器把另一套 Qt 库的头文件信息抓进来。这种情况在“装了 Qt 5.12,又装了 Qt 5.15”的机器上高频发生。
解决:打开系统的环境变量,把 PATH 里和当前 Qt 无关的 Qt 目录全部删掉,只保留 C:\Qt\Qt5.15.2\5.15.2\mingw81_64\bin 和 C:\Qt\Qt5.15.2\Tools\mingw810_64\bin,两块缺一不可。之后跑一次 qmake --version,确认输出的是同一个 Qt 5.15.2,再回来重新 configure。
5.2 链接时 cannot find -lqhull,甚至 cannot find -lpublic——库文件命名与导入库路径问题
现象:PCL 或 VTK 编译到最后一步链接时报cannot find -lqhull、cannot find -lpublic这类“找不到 xxx 库”的错误。“-lpublic”这种名字看着很像某个工程里自定义的库,本质和 qhull 一样:链接器按 -l 参数去找对应的 .a 文件,找不到就报。
原因:两条。一是 CMAKE_INSTALL_PREFIX 没被正确传进链接器参数,二是某些第三方库用 MSVC 命名规范生成 lib(比如 qhull.lib),MinGW 的链接器只认 libqhull.a 或 libqhull.dll.a,名字对不上就直接报 cannot find。
解决:检查对应库的 install 目录下 lib 文件夹里有没有 .a 或 .dll.a 结尾的导入库。没有就回到那个库的 CMake 配置里加-DCMAKE_SHARED_LINKER_FLAGS="-Wl,--out-implib,libqhull.dll.a"强制导出,或者干脆重新编译一遍该库,不用 Static 选项。PCL 的 CMake 对 qhull 的查找认不得自定义路径时,手动把 D:/dev/pcl-deps/qhull/lib 写进 CMAKE_PREFIX_PATH,再跑一次 configure。
5.3 boost 编出 msvc 格式的库——工具链参数缺失的表现
现象:PCL 配置阶段报Could NOT find Boost (missing: Boost_DIR),或者找到了 boost,但链接时报版本不兼容。
原因:b2 的 toolset 参数写成了 msvc,或者根本没写。前一种情况会生成 libboost_filesystem-vc143-mt-x64-1_82.lib,后一种情况 b2 会自动探测到 cl.exe,生成同样的 MSVC 命名。无论哪一种,在 MinGW 的链接器眼里都是“文件不存在”。
解决:删掉 boost 源码目录下的 bin.v2 缓存,回到源码根目录,重新跑一遍bootstrap.bat gcc,再跑带 toolset=gcc 的 b2 命令。验证方法还是第 3 章那个土办法:看 lib 目录下有没有 libboost_filesystem-mgw*-mt-x64-1_82.a,文件名中间带 mgw 才是 MinGW 版本。
5.4 VTK 版本过新导致 QVTKWidget 消失——Visualizer 组件的兼容性上限
现象:VTK 编的是 9.3.x,PCL configure 时显示 VTK found,但编译 pcl_visualization 时报找不到 QVTKWidget,或者运行时点云窗口一片黑、程序闪退。
原因:VTK 9.3 把 Qt5 的老 QVTKWidget 组件移除,改用 QVTKOpenGLNativeWidget。PCL 1.14 的 vtk_visualizer 依赖老接口,需要 QVTKWidgetPlugin 才能内嵌到 Qt 窗口里,新 VTK 没有它。
解决:要么锁定 VTK 9.2.6 编译,别追最新;要么升级 PCL 到最新 master 分支,但那个分支的 CMake 还在迭代,未必稳。我给团队的建议永远是前者:版本对齐比“版本最新”重要得多。同一个道理适用于 Qt——用 Qt 6 再走一遍这套流程,VTK 和 PCL 的坑只会更多。
6. 验证与部署:用 30 行代码确认整套 MinGW 编译链路能用
6.1 部署 dll:PATH 顺序与 Qt 平台插件路径
安装完成不是终点。PCL 编译出的多个动态库分散在 D:/dev/pcl-deps/pcl/bin,VTK、boost、flann、qhull 的 dll 也各自在对应安装目录里。运行验证程序前,把下列路径按顺序加入 PATH:
D:/dev/pcl-deps/pcl/bin D:/dev/pcl-deps/vtk/bin D:/dev/pcl-deps/flann/bin D:/dev/pcl-deps/qhull/bin C:/Qt/Qt5.15.2/5.15.2/mingw81_64/bin C:/Qt/Qt5.15.2/5.15.2/mingw81_64/plugins/platforms最后一条是 Qt 的平台插件目录。缺少它时程序会直接闪退或报qt.qpa.plugin: could not find the qt platform plugin "windows"。有同事在嵌入式板子上见过could not find the qt platform plugin "linuxfb",和这个就是同一类问题——插件目录不在搜索路径里。Windows 下更稳的做法是把 plugins 整个放到 exe 旁边,用 QT_QPA_PLATFORM_PLUGIN_PATH 指向它。
6.2 CMake 构建最小验证程序
写一个 30 行的验证程序,读取一个 pcd 文件并在 PCLVisualizer 里显示:
#include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <iostream> int main(int argc, char** argv) { if (argc < 2) { std::cerr << "usage: " << argv[0] << " <pointcloud.pcd>" << std::endl; return 1; } pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1) { std::cerr << "cannot load pcd" << std::endl; return 1; } pcl::visualization::PCLVisualizer viewer("PCL MinGW Test"); viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud"); while (!viewer.wasStopped()) { viewer.spinOnce(100); } return 0; }用 CMake 而不是手写 g++,是因为 PCLConfig.cmake 会自动带出 VTK 和 boost 的全部链接路径,省事得多:
cmake_minimum_required(VERSION 3.16) project(pcl_view_demo) set(CMAKE_PREFIX_PATH "D:/dev/pcl-deps/pcl;D:/dev/pcl-deps/vtk;C:/Qt/Qt5.15.2/5.15.2/mingw81_64") find_package(PCL 1.14 REQUIRED COMPONENTS common io visualization) add_executable(view view.cpp) target_link_libraries(view ${PCL_LIBRARIES}) target_include_directories(view PRIVATE ${PCL_INCLUDE_DIRS})配置、编译、跑起来能弹出窗口、旋转点云,这一步就算真的走通了。我第一次走完整套流程花了一整天,现在重跑一遍大概两个多小时,省下的时间主要是版本对齐——每次先确认 PATH,再确认每个依赖的版本号,最后才动手编译。这套顺序和参数我都写进了团队内部手册,照着走基本不会翻车。希望帮到你。
本文还有配套的精品资源,点击获取