[BUG]: Compilation failure with MSVC 17.12 (v14.44) and C++20: '_BACKUP_ITERATOR_DEBUG_LEVEL' undeclared
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 18k
- Forks
- 2.3k
- Avg merge
- 5d 17h
- Merged PRs (30d)
- 10
Description
Required prerequisites
- Make sure you've read the documentation. Your issue may be addressed there.
- Search the issue tracker and Discussions to verify that this hasn't already been reported. +1 or comment there if it has.
- Consider asking first in the Gitter chat room or in a Discussion.
What version (or hash if on master) of pybind11 are you using?
3.0.1
Problem description
This is a well-structured GitHub issue template you can use. It specifically targets the MSVC 17.12 incompatibility with the iterator debugging macros found in the Kratos core.
GitHub Issue Title:
Compilation failure with MSVC 17.12 (v14.44) and C++20: '_BACKUP_ITERATOR_DEBUG_LEVEL' undeclared
Description
When compiling Kratos Multiphysics, see https://github.com/KratosMultiphysics/Kratos/pull/14105, with the last pybind11 release on Windows using Visual Studio 2022 version 17.12 (MSVC 14.44) with the std:c++20 flag, the build fails in several python binding files due to a macro conflict in the MSVC Standard Library headers.
The error appears to originate from the <span> header in the MSVC STL, which seems unable to resolve the custom _BACKUP_ITERATOR_DEBUG_LEVEL macro used by Kratos to manage iterator debugging states.
Environment
- OS: Windows 10/11
- Compiler: MSVC 14.44.35207 (Visual Studio 2022 17.12)
- C++ Standard: C++20
- Python version: 3.10.11
- Build Type: Release
Error Log
C:\Program Files (x86)\...\include\span(179): error C2065: '_BACKUP_ITERATOR_DEBUG_LEVEL' : undeclared identifier
C:\Program Files (x86)\...\include\span(179): note: the template instantiation context (the oldest) is
C:\Program Files (x86)\...\include\span(31): note: during compilation of class template 'std::_Span_iterator'
C:\Program Files (x86)\...\include\span(179): error C3861: '_BACKUP_ITERATOR_DEBUG_LEVEL': identifier not found
Steps to Reproduce
- Use Visual Studio 2022 updated to version 17.12.
- Configure Kratos with CMake using
-DCMAKE_CXX_STANDARD=20. - Attempt to build the Kratos Core.
Potential Workaround
Adding in the header of <pybind11/pybind11.h>:
#if defined(_MSC_VER)
#ifndef _BACKUP_ITERATOR_DEBUG_LEVEL
#define _BACKUP_ITERATOR_DEBUG_LEVEL 0
#endif
#endif
Reproducible example code
(Sorry, but it is a full codebase, so I cannot isolate a snippet)
Is this a regression? Put the last known working version here if it is.
Not a regression
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with pybind11/pybind11.h and the MSVC error context, then reproduce the CMake C++20 build described for Kratos PR 14105 using MSVC 14.44. Done means the affected build compiles without the _BACKUP_ITERATOR_DEBUG_LEVEL error in the stated environment.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cmake, cpp, python
- Domain
- build-system, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100