Skip to content

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

@FrBrenno

Description

@FrBrenno

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:

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions