#6360·pcl

[第三方] VTK 9.4 公开了 nlohmann::json,导致 ODR 发生冲突

作者: FrBrenno创建于 2025年10月7日更新于 2025年10月9日
标签kind: bug

描述错误
使用与 VTK 9.4 连接的 PCL 时, VTK 中内置的 nlohmann::json(在 vtk_nlohmannjson.h 中重命名为 vtknlohmann) 会被公开暴露。这会导致冲突,如果项目同时使用单独的 nlohmann::json 配置,编译器就会为使用项目自己的 nlohmann::json 的任何函数生成一致定义规则(ODR) 相关冲突。此外,编译器不理解 nlohmann::json 并迫使我使用 vtknlohmann::json,这是内置的 VTK json。
背景
我正在尝试将 PCL 添加到我的项目中以进行点云可视化,并遇到了此问题。PCL 安装本身运行良好(除了"PATH 太长无法更改"的警告之外,我手动解决了此问题)。
我使用 Windows 11Visual Studio 2022
要重现

  1. 使用 CMake 为项目安装、配置和链接 nlohmann::json(我使用了 FetchContent)。
  2. 安装 PCL(最新版本),并使用 CMake 将其链接到项目中。
  3. 编写使用自定义 nlohmann::json 的函数。
  4. 编写使用 VTK 的函数(错误出现在我尝试可视化点云时)。
    屏幕截图/代码片段
    显示冲突的屏幕截图:
Image 由最后一条错误所指示的代码片段: Image 请注意第 62 行的错误:编译器期望使用 `vtknlohmann` 而不是 `nlohmann`,因为 VTK 在这里重新定义了它: Image **我的环境** - 操作系统:Windows 11 24H2 - 编译器:MSVC 19.44.35217.0 - PCL 版本:1.15.1 **可能的解决方案** 以下是有关此问题的一些资源: - https://discourse.vtk.org/t/conflict-with-vtknlohmann-and-nlohmann/14977 - https://discourse.vtk.org/t/nlohmann-json-and-vtks-public-api/15131 - https://GitLab.kitware.com/vtk/vtk/-/merge_requests/11854#05ea885e5469ae3672a62ca185b451ca5aaaa3a0 - https://GitLab.kitware.com/vtk/vtk/-/merge_requests/11163 此问题在 VTK 9.5 中似乎已解决。可能的方法包括: - 将 PCL 与 VTK 9.5 连接的版本升级。 - 使用 `VTK_MODULE_USE_EXTERNAL_VTK_nlohmannjson=ON` 重新构建 VTK。 - 在 PCL 中应用一种工作方法,以避免冲突,同时保持 VTK 9.4。 **其他信息** 这是我第一次提交问题,因此抱歉如果它不完美。 我尝试研究源代码以提出修复方案,但尚未取得进展。我计划进一步调查。

内容来源: PointCloudLibrary/pcl