Что означает _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. Но я уверен, что это не так.
Ответы
Ответ 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.