Подтвердить что ты не робот

Что означает _ITERATOR_DEBUG_LEVEL = 1?

В VS2010, проекте С++, я получаю эту ошибку при связывании в x64/Release:

ошибка LNK2038: обнаружено несоответствие для '_ITERATOR_DEBUG_LEVEL': значение '0' не соответствует значению '1'

Все другие комбинации конфигурации/платформы соединяются просто отлично. Таким образом, статическая библиотека построена с параметром _ITERATOR_DEBUG_LEVEL, установленным в 0, и DLL, которая от этого зависит, как-то имеет значение _ITERATOR_DEBUG_LEVEL, установленное в 1. Я пытаюсь понять, что это значит, поэтому я могу выяснить, как отключить его!

Единственные ссылки на эту ошибку, которые я обнаружил при работе в Google, когда _ITERATOR_DEBUG_LEVEL конфликтуют со значениями 0 и 2. Это указывает на попытку связать выпуск с debug. Но я уверен, что это не так.

4b9b3361

Ответ 1

Хорошо, после битвы с этим в течение часа я понял это сразу после того, как задал вопрос... для потомков:

_ITERATOR_DEBUG_LEVEL = 0 (in release mode)
_ITERATOR_DEBUG_LEVEL = 1 (in release mode if _SECURE_SCL is defined)
_ITERATOR_DEBUG_LEVEL = 2 (in debug mode)

Как-то у меня была _SECURE_SCL, определяемая как определение препроцессора только в конфигурации Release/x64 моей DLL, и мне пришлось очень сильно прищуриться, чтобы заметить это. Как только я удалил это определение, ошибка исчезла.

Изменить: Я нашел эту приятную лекцию/учебник по msdn, которая (среди прочего) объясняет _ITERATOR_DEBUG_LEVEL. К сожалению, для этого требуется довольно недавняя версия Microsoft Silverlight.

Ответ 2

Я столкнулся с этой проблемой в сборке релизов, но обнаружил, что мой препроцессор определял _DEBUG, когда это должно было быть NDEBUG. Исправлена ​​проблема с заменой на NDEBUG.

Ответ 3

Для тех, кто имеет безупречные определения препроцессора, но все еще страдает от этой ошибки, проверьте настройку библиотеки времени выполнения проекта.

Если установлена ​​одна из версий отладки, _ITERATOR_DEBUG_LEVEL будет установлена ​​в 2.