ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化

Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化 简介基于Qt的MinGW编译点云库及其全部依赖库的完整资源包面向在Windows环境下使用MinGW工具链从事三维点云开发的C工程师。资源解决了PCL在Qt环境中编译时依赖库难以配齐的问题提供了Boost、Eigen、FLANN、Qhull、VTK等底层库的头文件与编译说明适合正在搭建开发环境或希望摆脱Visual Studio改用MinGW编译链的开发者参考。压缩包共两千个文件以一千九百九十七个hpp头文件为主覆盖各依赖库的接口声明与模板实现另含txt说明、pdf文档和doc文档介绍依赖关系、版本匹配及编译注意事项整体大小约一百五十一点三一兆字节。已有三十六人学习下载属于需求明确但使用价值较高的实践资料。借助该包可以免去逐个收集依赖库的繁琐流程直接获得与MinGW兼容的头文件集合并按文档理清编译顺序与常见报错为后续点云算法开发节省大量环境配置时间。1. 在 Windows 上从零编译 PCL为什么非 MinGW 路线不可在 Qt 的 MinGW 环境下编译 PCL表面看就是跑几次 CMake实际是把 boost、eigen、flann、qhull、VTK 这一整条依赖链全部用同一套编译器重新过一遍。任何一个库的编译参数不对最后都会在 PCL 的链接阶段变成让人挠头的诡异报错。我最早也图省事想直接下预编译版结果 PCL 官方只提供 MSVC 的 Windows 包Qt 偏偏用的是 MinGW 套件两边混用直接抛 Qt 版本不兼容的 fatal error折腾到半夜才明白这条路走不通。这篇笔记把完整流程串起来工具链怎么选、每个依赖库的 CMake 参数怎么设、哪些坑值得提前绕开最后给一个能在 Qt Creator 里跑起来的最小点云窗口。适合要在 Qt 里做点云可视化、又不想为编译额外装 Visual Studio 的 C 开发者。2. 工具链选型MinGW、MSVC 与 Qt 套件的匹配原则2.1 为什么优先选 MinGW 而不是 MSVCQt 官方的 Windows 安装包向来做两个套件MSVC 套件和 MinGW 套件。MSVC 套件要求你先装 Visual Studio编译器是微软的 cl.exe调试器用 CDB 或 VS 自带的调试器MinGW 套件则直接把 GCC 移植到 Windows 上Qt 安装完就带一套完整的 gcc/g/gdb体积小和 Qt Creator 的项目设置开箱即用。选择 MinGW 的核心理由是 ABI 一致性。Windows 上 MSVC 和 GCC 的 C 二进制接口不兼容包括符号修饰规则、std::string 的内存布局、异常处理模型都不完全一样。用 MSVC 编的库去链接 MinGW 编的程序最常见的下场就是链接器报一堆 unresolved external symbol或者更隐蔽的运行时崩溃。而 PCL 官方虽然提供 Windows 预编译包但那是以 MSVC 为目标编译的和 Qt 的 MinGW 套件不是一家人。所以走到“编 PCL”这一步本质上没有捷径要么换 MSVC 套件配合 VS要么就让所有依赖库统一用 MinGW 从源码过一遍。我个人选择 MinGW 还因为一个实际原因项目里要用 Qt Creator 做界面调试MinGW 套件下 GDB 对 Qt 的数据结构支持很完善不需要额外配置。而且这台机器上没装 VS严格说也不打算装一套 MinGW 8.1.0 加 CMake 就能完成全部工作。2.2 版本匹配一套不会打架的组合版本匹配是这次编译里最不值得挑战的部分。PCL、VTK、Boost 这三者的版本互相绑定得很紧乱配版本等于给自己挖坑。下面这组是我实测可用、也是这份资源包里默认采用的组合建议直接照抄Qt 套件自带 MinGW建议 CMakeBoostEigenFLANNQhullVTKPCLQt 5.15.2MinGW 8.1.03.221.72.03.3.91.9.18.0.29.0.31.12.1Qt 6.2MinGW 11.2.03.241.763.4.01.9.18.0.29.11.13为什么是这套组合PCL 1.12.1 是官方开始完整支持 VTK 9 的版本VTK 8.2 的老模块命名在 1.11 之前还留了兼容层到 1.12 基本就是按 VTK 9 的模块体系来的所以别用 PCL 1.10 去配 VTK 9否则 find_package(VTK) 能找到链接阶段会发现一堆模块名对不上。FLANN 1.9.1 对 Boost 的序列化库版本很敏感我用 Boost 1.72 和它是稳定组合选 Boost 1.76 以上就得准备给 FLANN 源码打补丁没必要。Qt 5.15.2 自带的 MinGW 是 8.1.0Qt 6.2 自带 11.2.0两者生成的库文件格式兼容但为了少踩坑我建议整条链子都用同一个 Qt 安装包里的编译器而不是用 PATH 里可能存在的另一个 gcc。编译器不一致导致的链接错误非常难排查属于那种查一晚上都发现不了的类型。2.3 目录规划与 CMAKE_PREFIX_PATH 的统一写法编译依赖库前先定目录后面能省大量时间。我在 D 盘建了一个 deps 根目录每个库独立安装到自己的 install 目录最后 PCL 的 CMake 配置一次性把所有这些目录塞进 CMAKE_PREFIX_PATH。D:/pcl-mingw-deps/ ├── src/ # 所有依赖库源码解压目录 │ ├── boost_1_72_0/ │ ├── eigen-3.3.9/ │ ├── flann-1.9.1/ │ ├── qhull-8.0.2/ │ └── VTK-9.0.3/ ├── install/ # 所有编译产物的安装目录 │ ├── boost/ │ ├── eigen3/ │ ├── flann/ │ ├── qhull/ │ └── vtk/ └── pcl-src/ # PCL 源码 └── pcl-1.12.1/每个库在 CMake 配置时都要显式指定编译器路径不要依赖系统的 PATH 环境变量。下面的写法带有通用性后续每个库都用同样的开头cmake -S . -B build \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe \ -DCMAKE_MAKE_PROGRAMD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/mingw32-make.exe \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/库名这一段的关键是 CMAKE_MAKE_PROGRAM。Qt 自带的 MinGW 目录里是 mingw32-make.exeCMake 如果从 PATH 里找到别的 make 或者找不到 make就会退回生成别的生成器所以一开始就指明确认生成器是 “MinGW Makefiles”。CMAKE_INSTALL_PREFIX 每个库单独设这样后面 PCL 配置时只需要把 install 下的各个目录按顺序写进 CMAKE_PREFIX_PATH 即可。还有个小习惯编译说明用 Release 一个配置不要同时编 DebugMinGW 下两个配置混着链接很麻烦。3. 依赖库逐个击破boost、eigen、flann、qhull 与 VTK 的 CMake 参数3.1 boostb2 只编需要的模块Boost 在依赖链里工作量最大但真正要编出二进制库的模块不多。PCL 主要用到 Boost 的 filesystem、thread、date_time、iostreams、serialization其他大部分是头文件库。资源包里 boost 部分把 geometry 扩展目录都带全了比如 include/boost/geometry/extensions 下能看到 quadedge.hpp、rtree.hpp、epsg_traits.hpp 这类文件这些在 PCL 做 kd-tree 和几何处理时会被间接引用到缺了头文件编译期就报错。先用 bootstrap 生成 b2cd D:/pcl-mingw-deps/src/boost_1_72_0 call bootstrap.bat gccbootstrap.bat 后面跟 gcc 参数是让 b2 默认使用 GCC 工具集这一步在 Windows 下不能漏否则生成的 b2 默认去找 MSVC。生成完 b2.exe 后执行下面的命令b2.exe install \ --toolsetgcc \ --prefixD:/pcl-mingw-deps/install/boost \ --build-typecomplete \ --layouttagged \ --with-filesystem \ --with-thread \ --with-date_time \ --with-iostreams \ --with-serialization \ address-model64 \ linkstatic \ runtime-linkstatic \ threadingmulti \ variantrelease这里几个参数值得说清楚。address-model64 必须显式指定MinGW 的 gcc 默认在 64 位环境下能编出 64 位库但某些老版本会踩到默认值不对的坑。linkstatic 和 runtime-linkstatic 是我故意选的后面 PCL 链接时不用带一堆 DLL避免运行时找 boost 的 DLL 找不到如果你更想用动态库两个参数都改成 shared 就行但注意 debug 和 release 的库文件名要区分清楚。--layouttagged 会让库文件名带上 gcc 版本和链接方式标记例如 libboost_filesystem-mgw81-mt-s-x64-1_72.a这样以后混版本时不容易拿错库。编译耗时看机器只编这几个模块大概 10 到 15 分钟。编完后检查 install/boost/lib 下出现了 libboost_filesystem-mgw81-mt-s-x64-1_72.a 这类文件就算成功。常见翻车点是 bootstrap 阶段报“无法识别 gcc 工具集”这通常是因为 PATH 里没有 gcc需要先把 MinGW 的 bin 目录加进 PATH 再执行。3.2 eigen头文件库也要走 CMakeEigen 严格来说不用编译它的全部实现都在头文件里但 PCL 通过 find_package(Eigen3) 来找它所以还是得把它的 CMake 配置文件安装到统一目录。这一步很少有人卡住但容易有人偷懒直接解压源码到某个路径然后手工设 Eigen3_DIR结果 PCL 配置时还是报找不到其实多跑一次 CMake 安装就一劳永逸cmake -S . -B build \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/eigen3 \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe cmake --build build --target install执行完后install/eigen3/share/eigen3/cmake 下会出现 Eigen3Config.cmake 和 Eigen3Targets.cmakePCL 的 find_package(Eigen3) 靠的就是这两个文件。Eigen 版本别低于 3.3.7PCL 1.12 的 kd-tree 模块用了比较新的 Eigen 特性旧版本会在编译时报 Eigen 内部的 static assertion那个报错信息不是一般地难懂。3.3 qhull参数不多但别选错库文件名Qhull 老版本 2015.2 和新版本 8.0.2 的 CMake 选项有差异我这次用的是 8.0.2也就是资源包里对应的 qhull-8.0.2 源码目录。配置命令如下cmake -S . -B build \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/qhull \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe \ -DQHULL_COMPILE_DEFINES \ -DBUILD_SHARED_LIBSOFF \ -DBUILD_STATIC_LIBSON cmake --build build --target install -- -j8qhull 的静态库会生成两个libqhullstatic_r.a 和 libqhullstatic.a。PCL 的 CMake 找 Qhull 时默认找的是 libqhullstatic_r.a这个 _r 后缀代表 reentrant可重入版本。如果只编出不带 _r 的版本PCL 配置会报 Could NOT find Qhull。所以上面 BUILD_STATIC_LIBSON 不能省。另外不需要装 pthread 相关的扩展模块PCL 只用到 qhull 的核心几何计算。3.4 flann整条链子里最挑编译器的一个FLANN 1.9.1 是这套依赖里最容易翻车的库问题基本集中在和 Boost 版本的配合上。它在 MinGW 下的兼容性测试远不如 MSVC 充分源码里的一些模板实例化在 GCC 下会触发更严格的检查。我的建议是严格按 1.72.0 版 Boost 来配并且在配置阶段把一堆无关功能全部关掉cmake -S . -B build \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/flann \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe \ -DBUILD_CUDA_LIBSOFF \ -DBUILD_PYTHON_BINDINGSOFF \ -DBUILD_MATLAB_BINDINGSOFF \ -DBUILD_TESTSOFF \ -DUSE_OPENMPOFF \ -DCMAKE_PREFIX_PATHD:/pcl-mingw-deps/install/boost cmake --build build --target install -- -j8BUILD_CUDA_LIBS、BUILD_PYTHON_BINDINGS、BUILD_MATLAB_BINDINGS 这三个必须全关MinGW 环境下这些依赖一样找不到开了就是 CMake 报一堆红字错误。USE_OPENMP 建议关MinGW 的 OpenMP 运行时和 flann 的编译开关组合在运行时偶尔有性能反而变差的情况点云特征匹配的场景用不上多线程加速关了省心。编译时如果看到 src/cpp/CMakeFiles 里出现 mpl 或者 serialization 相关报错基本就是 Boost 版本超了 1.72 的容忍上限。解决方式是降 Boost 版本或者把 flann 源码里 src/cpp/flann/util/serialization.h 换成社区补丁版本但补丁操作很容易在拷贝时漏掉宏定义所以我不推荐新手走这条路。flann 的可视化相关示例也建议全关省得编译完还得手动清理一堆示例程序的链接错误。装完后 flann 的 CMake 配置文件会安装在 install/flann/lib/cmake/flann 下后面 PCL 找不到 flann 几乎都是这个路径没被 CMAKE_PREFIX_PATH 涵盖。3.5 VTKQt 显示集成是重点VTK 是整套依赖里编译耗时最长、CMake 选项也最容易设错的库。因为 PCL 的 visualization 模块要向 Qt 窗口里嵌入 VTK 渲染视图VTK 必须提前编出 Qt 相关的接口模块这一步在配置阶段就要反映出来否则后面 PCL 编出来了也用不了可视化。cmake -S . -B build \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/vtk \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe \ -DVTK_Group_QtON \ -DVTK_QT_VERSION5 \ -DCMAKE_PREFIX_PATHD:/Qt/Qt5.15.2/5.15.2/mingw81_64 \ -DVTK_Group_RenderingON \ -DVTK_BUILD_TESTINGOFF \ -DVTK_BUILD_EXAMPLESOFF \ -DBUILD_SHARED_LIBSON cmake --build build --target install -- -j8VTK_QT_VERSION 必须和实际 Qt 匹配Qt 5.15.2 就写 5如果写 6 的话 VTK 会去找 Qt6 的 CMake 配置文件直接报错说找不到。CMAKE_PREFIX_PATH 指到 Qt 的 mingw81_64 目录VTK 才能在配置阶段通过 find_package(Qt5) 定位到 Qt 库和 moc、uic 等工具。VTK_Group_RenderingON 是必须的PCL 的可视化模块依赖渲染组里的 vtkRenderingCore、vtkRenderingQt 等一整套模块VTK_BUILD_TESTING 和 VTK_BUILD_EXAMPLES 关掉能省不少编译时间这两个选项默认情况下会把测试程序也编一遍白白多花半小时。VTK 的 install 步骤会把所有头文件和模块的 CMake 配置文件导出到 install/vtk/lib/cmake/vtk-9.0 下。编译时长 8 核机器大约一小时出头期间遇到个别模块警告不用管。VTK 安装完成后检查 install/vtk/bin 下是否有 vtkGUISupportQt 相关的 DLL少了它 PCL 可视化窗口就跑不起来。4. 编译 PCL 本体CMake 配置、模块裁剪与 Qt 显示打通4.1 PCL 配置依赖全部找到的检查清单所有依赖库就位后PCL 本体的 CMake 配置就成了一个“检查依赖是否全部找到”的过程。下面是完整的配置命令依赖库的安装路径按顺序全部写进 CMAKE_PREFIX_PATHcmake -S . -B build \ -DCMAKE_INSTALL_PREFIXD:/pcl-mingw-deps/install/pcl \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_C_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/gcc.exe \ -DCMAKE_CXX_COMPILERD:/Qt/Qt5.15.2/Tools/mingw810_64/bin/g.exe \ -DCMAKE_PREFIX_PATHD:/pcl-mingw-deps/install/boost;D:/pcl-mingw-deps/install/eigen3;D:/pcl-mingw-deps/install/flann;D:/pcl-mingw-deps/install/qhull;D:/pcl-mingw-deps/install/vtk;D:/Qt/Qt5.15.2/5.15.2/mingw81_64 \ -DWITH_VTKON \ -DWITH_QTON \ -DWITH_OPENGLON \ -DBUILD_appsOFF \ -DBUILD_toolsOFF \ -DBUILD_examplesOFF \ -DBUILD_visualizationON \ -DBUILD_ioONCMAKE_PREFIX_PATH 的顺序有讲究boost、vtk 这些要先于 Qt 的目录这样 find_package 优先命中我们刚才编译的版本不会误抓系统里可能存在的其他依赖库。配置完成后先别急着编译逐行看输出里的 Found 信息PCL 的 CMake 会打印每个依赖库的版本和路径确认 flann 找到的是 install/flann 而不是别的目录Eigen3 版本是 3.3.9 而不是系统残留的 3.2。BUILD_apps、BUILD_tools、BUILD_examples 这三个是 PCL 仓库自带的应用和示例编译它们非常耗时且对库的使用没有直接帮助直接关掉。BUILD_visualization 和 BUILD_io 是必须开的io 提供 pcd 文件的读写visualization 才是 PCLVisualizer 所在的模块。如果你的项目只做算法不涉及界面BUILD_visualization 可以关但既然目标是 Qt 集成这个开关保持 ON。4.2 链接 Qt 与 VTK藏在模块名里的坑PCL 的 visualization 模块在编译时会通过 VTK 的 CMake 配置去链接 vtkGUISupportQt 和 vtkRenderingQt 这两个模块所以 VTK 编译阶段如果没有把 Qt 组打开PCL 配置到 visualization 时会直接报 vtkGUISupportQt 找不到。这个报错信息不会提示你去查 VTK 的编译参数而是指向 PCL 源码的 visualization 目录非常容易误导人以为是 PCL 源码问题。另一类常见问题是 PCL 源码包依赖的 VTK 模块版本。VTK 9 的模块按组件划分PCL 1.12 的源码里写的是 vtkGUISupportQt 和 vtkRenderingQt如果你用的是 VTK 8.2模块名变成 vtkGUISupportQtOpenGL链接阶段就会遇到符号缺失。所以我在第 2 章强调选 VTK 9.0.3 配 PCL 1.12.1是编译前就要定好的事不是编完再调的事。配置完成后执行编译cmake --build build --target install -- -j8PCL 的编译量相比 VTK 小不少大约 20 到 40 分钟。编译期间如果报某个头文件找不到优先去查这个头文件属于哪个依赖库再用资源包解压出来的源码目录去对照基本都能定位是 CMAKE_PREFIX_PATH 里少了某条路径。这里我有个习惯编译前把完整路径复制到记事本留档报错时直接搜索最后一段路径比在终端里翻屏快得多。4.3 运行时链接DLL 配置与 windeployqt编译完成后PCL 的 DLL、VTK 的 DLL、Qt 的 DLL 分散在三个目录里运行任何 QtPCL 程序前必须让程序找到它们。最简单的做法是在 Qt Creator 的项目运行环境里追加 PATH也可以在系统环境变量里加。我建议在系统 PATH 里固定追加下面三条因为是长期开发环境不是一次性运行D:/pcl-mingw-deps/install/vtk/bin D:/pcl-mingw-deps/install/pcl/bin D:/Qt/Qt5.15.2/5.15.2/mingw81_64/bin如果只做临时测试也可以把这三条加进 Qt Creator 的“构建环境”里效果一样。Qt 的 bin 目录里必须带 platforms 子目录下的 qwindows.dll这个文件负责 Windows 平台的窗口插件缺了它程序会直接崩溃报 qt.qpa.plugin: could not find the Qt platform plugin windows很多人会把问题往 PCL 上想其实是 Qt 部署问题。发布程序时用 Qt 自带的 windeployqt 工具来收集 DLL 是最省事的D:/Qt/Qt5.15.2/5.15.2/mingw81_64/bin/windeployqt.exe --qmldir . your_app.exe这个命令会把 Qt 的运行时 DLL 和插件目录自动拷贝到 exe 同目录VTK 和 PCL 的 DLL 再用手工拷贝的方式补进去。注意 windeployqt 只处理 Qt 依赖不会处理 VTK 和 PCL 的依赖这两个需要自己复制。5. 避坑MinGW 编译 PCL 的 5 条血泪记录5.1 环境与工具链类故障坑一cannot mix incompatible Qt library (version ex50601) with this library现象编译一个 QtVTK 小程序时在链接阶段或者运行初始化时报出类似 “cannot mix incompatible Qt library (version ex50601) with this library” 的错误程序无法启动。原因报错里的版本标记说明当前程序链接到的 Qt 库和实际用的 Qt 库不是同一套编译产物。最常见的是 Qt 库由 MSVC 编译而程序用 MinGW 编译器或者反过来。MSVC 和 MinGW 的 Qt 库二进制不兼容符号修饰和内部数据结构都有差异。解决全链路统一编译器。确认 Qt 的安装目录是 mingw81_64 这套程序编译时明确指定 CMake 的 CMAKE_PREFIX_PATH 指向同一个 Qt 目录不要让 PATH 里残留的另一个 Qt 版本抢先被找到。检查 PATH 的时候可以用 where qmake 看实际命中的路径。坑二运行时报 “procedure entry point could not be located”现象exe 能启动但加载到某个环节弹窗提示某个函数入口点找不到指向的 DLL 通常是 boost 或 VTK 的某个库文件。原因程序运行时加载到了错误版本的动态库。常见场景是系统 PATH 里同时存在两个 boost 安装目录或者 debug 和 release 版本的 DLL 名字相同被混用。MinGW 下默认的 boost 库文件名不带 debug/release 区分--layoutsystem 创建的库名很容易被另一个版本覆盖。解决boost 编译时使用 --layouttagged让库文件名带上 mgw81、mt-s 这类标记避免不同版本文件互相覆盖。同时把系统 PATH 里旧的 boost 或 VTK 目录清掉只保留 D:/pcl-mingw-deps/install 下的路径。5.2 编译与链接类故障坑三flann 编译到 boost serialization 时报模板错误现象编译 flann 时在 src/cpp/flann/util/serialization.h 附近报出一长串模板实例化错误错误信息里频繁出现 boost::archive 相关字样。原因flann 1.9.1 写的序列化模板是基于 Boost 1.72 时代的接口用更新的 Boost 版本编译时Boost 修改了某些模板签名GCC 的模板检查又比 MSVC 严格于是直接暴露出来。解决把 Boost 固定到 1.72.0 再编译 flann不要试图升级 flann 或 Boost 单方面解决问题。如果已经下载了更新版本的 Boost唯一省事的方式是换回 1.72而不是花时间给 flann 打补丁。坑四PCL 配置时报 Could NOT find FLANN现象cmake 配置 PCL 时错误列表里出现 FLANN_DIR 未找到的提示但 flann 明明已经编译安装过了。原因flann 的安装目录不在 CMAKE_PREFIX_PATH 里或者 flann 安装时它的 cmake 配置文件没有导出到标准的 lib/cmake 路径。有些 flann 版本安装后配置文件在 share/flann/cmake 下CMake 的搜索路径不完全一致。解决在 PCL 的 cmake 命令里显式追加 FLANN_DIRD:/pcl-mingw-deps/install/flann/lib/cmake/flann同时检查 install/flann 下是否有 flann-config.cmake 或类似文件。如果连这个文件都没有回 flann 的 build 目录重新执行 install 目标。坑五运行 PCL 可视化程序闪退或报 “cannot find -lvtkGUISupportQt”现象PCL 编译成功了但链接自己写的可视化程序时报 vtkGUISupportQt 相关的库找不到或者运行时闪退。原因VTK 编译时没有开启 VTK_Group_Qt导致 VTK 的 Qt 支持模块压根没编出来。PCL 配置阶段虽然没报错但到了链接环节才暴露缺失。解决回 VTK 的 build 目录确认 VTK_Group_Qt 配置为 ONVTK_QT_VERSION 与实际 Qt 版本一致重新编译并安装 VTK之后记得把 install/vtk/bin 添加到 PATH。这一步不能跳过VTK 的 Qt 模块不是默认编译项。6. 验证与进阶一个最小 PCL 点云窗口与后续配置习惯依赖链全部编完后用一个小项目验证整套环境是否真正打通。下面这个 demo 在 Qt 的窗口中嵌入 VTK 渲染视图生成 100 个随机点并显示是验证 PCL 可视化链路的最短路径。先建一个 CMake 工程CMakeLists.txt 里把依赖库的路径指向前面的 install 目录cmake_minimum_required(VERSION 3.16) project(pcl_qt_min_demo) set(CMAKE_CXX_STANDARD 14) set(CMAKE_AUTOMOC ON) find_package(PCL 1.12 REQUIRED COMPONENTS common io visualization) find_package(VTK 9 REQUIRED) find_package(Qt5 REQUIRED COMPONENTS Widgets) add_executable(pcl_qt_min_demo main.cpp) target_link_libraries(pcl_qt_min_demo ${PCL_LIBRARIES} ${VTK_LIBRARIES} Qt5::Widgets )PCL_LIBRARIES 变量会把 visualization 模块以及它依赖的 vtkRenderingQt 一并带进来VTK_LIBRARIES 保证所有 VTK 模块都能被解析到。CMAKE_AUTOMOC 必须要开因为继承 QObject 的类需要 moc 处理。main.cpp 的内容是核心#include QApplication #include QMainWindow #include QVTKOpenGLNativeWidget.h #include vtkGenericOpenGLRenderWindow.h #include vtkNew.h #include pcl/point_cloud.h #include pcl/point_types.h #include pcl/visualization/pcl_visualizer.h int main(int argc, char** argv) { QApplication app(argc, argv); auto* widget new QVTKOpenGLNativeWidget; vtkNewvtkGenericOpenGLRenderWindow renderWindow; widget-setRenderWindow(renderWindow.Get()); pcl::visualization::PCLVisualizer::Ptr viewer( new pcl::visualization::PCLVisualizer(renderWindow.Get(), nullptr, viewer, false)); pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); cloud-width 100; cloud-height 1; cloud-points.resize(cloud-width * cloud-height); for (size_t i 0; i cloud-points.size(); i) { cloud-points[i].x 1024 * rand() / (RAND_MAX 1.0f); cloud-points[i].y 1024 * rand() / (RAND_MAX 1.0f); cloud-points[i].z 1024 * rand() / (RAND_MAX 1.0f); } viewer-addPointCloudpcl::PointXYZ(cloud, scene); viewer-resetCamera(); QMainWindow window; window.setCentralWidget(widget); window.resize(800, 600); window.show(); return QApplication::exec(); }这段代码里PCLVisualizer 构造函数的第一个参数传入了 vtkGenericOpenGLRenderWindow这是 VTK 9 与 Qt 对接的标准方式VTK 8 用的 QVTKOpenGLWidget 在 VTK 9 里被 QVTKOpenGLNativeWidget 替代头文件和类名都变了。viewer 的 addPointCloud 是验证点云渲染的最小调用resetCamera 让相机自动对准点云中心。运行起来后按住鼠标左键拖拽旋转视角滚轮缩放这些都是 VTK 交互器默认提供的。这个 demo 能跑通说明从 boost 到 VTK 再到 PCL 的整条依赖链全部正常接下来就可以在这个基础上扩展自己的点云处理流程了。后续配置新项目时我每次都强制走一遍固定的流程先把 CMAKE_PREFIX_PATH 完整贴进 CMakeLists 的注释里留档再核对 Qt Creator 的构建套件是不是 MinGW 8.1.0最后看一眼系统 PATH 里有没有混进别的 Qt 目录。做习惯之后这套环境基本不用再折腾也希望这份编译笔记能帮你在 MinGW 这条路上少花几个通宵。本文还有配套的精品资源点击获取
返回列表