С++ Связывание выпущенной библиотеки с моей отладочной сборкой

Я загрузил стороннюю библиотеку и создал файл .lib в режиме "выпуска". После добавления lib в мой проект, если я запустил свой проект в режиме выпуска, это прекрасно. Но если я запустил свой проект в режиме отладки, я получаю сообщение об ошибке:

_iterator_debug_level value '0' doesn't match value '2;

Я мог бы перестроить библиотеку в режиме отладки, но я не думаю, что мне нужно будет отлаживать библиотеку самостоятельно? И я загрузил готовые сторонние библиотеки, перед которыми только приходит релиз (я предполагаю?), Который отлично связывает мой проект с отладкой или выпуском. Мне интересно, как это делается.

Ответ 1

Если вы хотите распространять библиотеку выпусков, которую другие могут использовать в режиме выпуска или отладки, вам нужно сделать две вещи:

  • Создайте DLL, чтобы вы получили свою собственную копию библиотеки времени выполнения C
  • Не передавать ресурсы CRT, такие как куча, через границу библиотеки. Самое важное для кода C состоит в том, что динамически выделяемая память должна быть освобождена на одной стороне границы. Для кода С++ вы можете использовать пространство имен std внутри вашей DLL, но не передавать эти объекты через границу.

Это то, что, скорее всего, сделали готовые сторонние библиотеки. Вы можете сделать то же самое с вашей библиотекой, только если внешний интерфейс не использует объекты CRT. Или вы можете создавать отдельные версии выпуска и отладки как статические библиотеки.

Ответ 2

Похоже, что ваш отладочный двоичный файл и загруженная вами библиотека используют несовместимые режимы отладки итератора. Отладчик Iterator обычно управляется макросами. В зависимости от значений макроса могут меняться размеры интерпретаторов и многих других объектов. Вам повезло, что ваша программа выбрала полезное сообщение об ошибке вместо просто раздавливания.

Проверьте документацию библиотеки и убедитесь, что ваш проект использует тот же режим отладки итератора. Вы также можете попробовать перекомпилировать библиотеку в режиме деблокирования. Если это не поможет, вам придется перекомпилировать библиотеку в режиме отладки, даже если вы не собираетесь отлаживать библиотеку.