pcl icon indicating copy to clipboard operation
pcl copied to clipboard

[3rd Party] VTK 9.4 exposes nlohmann::json publicly, causing ODR conflicts

Open FrBrenno opened this issue 2 months ago • 1 comments

Describe the bug

When using PCL linked with VTK 9.4, the internal nlohmann::json bundled inside VTK (renamed to vtknlohmann in vtk_nlohmannjson.h) is exposed publicly. This causes conflicts when a project also uses a separate nlohmann::json configuration: the compiler raises One Definition Rule (ODR) conflicts for any functions that use the project’s own nlohmann::json. Moreover, the compiler does not understand the nlohmann::json and kind of forces me to use vtknlohmann::json, which is the internal VTK json.

Context

I was trying to add PCL to my project for point cloud visualization and encountered this bug. PCL installation itself works flawlessly (except for a warning “PATH is too long to be changed,” which I resolved manually).

I am on Windows 11 using Visual Studio 2022.

To Reproduce

  1. Install, configure, and link nlohmann::json for your project using CMake (I used FetchContent).
  2. Install PCL (latest release) and configure CMake to link it to your project.
  3. Write a function using your own nlohmann::json.
  4. Write a function that uses VTK (the error appeared when I tried to visualize a point cloud).

Screenshots / Code snippets

Screenshot showing the conflict:

Image

Code snippet indicated by the last error:

Image

Note the error at line 62: the compiler expects vtknlohmann instead of nlohmann because VTK redefines it here:

Image

My Environment

  • OS: Windows 11 24H2
  • Compiler: MSVC 19.44.35217.0
  • PCL Version: 1.15.1

Possible Solutions

Here are some resources about this problem:

  • 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

This problem appears to be resolved in VTK 9.5. Possible approaches:

  • Upgrade the VTK version distributed with PCL to 9.5.
  • Rebuild VTK with VTK_MODULE_USE_EXTERNAL_VTK_nlohmannjson=ON.
  • Apply a workaround in PCL to avoid conflicts while keeping VTK 9.4.

Additional Information

This is my first issue submission ever, so sorry if it’s not perfect.

I tried exploring the source code to propose a fix, but haven’t made progress yet. I plan to investigate further.

FrBrenno avatar Oct 07 '25 14:10 FrBrenno

@FrBrenno Thank you for reporting this. Am I correct that you are using the PCL All-In-One installer? If yes, you could alternatively use vcpkg to install PCL: https://pcl.readthedocs.io/projects/tutorials/en/master/pcl_vcpkg_windows.html#pcl-vcpkg-windows

mvieth avatar Oct 09 '25 19:10 mvieth