C ++ Linking Release Встроенная библиотека с моей отладочной сборкой - PullRequest
10 голосов
/ 24 апреля 2011

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

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

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

Ответы [ 2 ]

11 голосов
/ 24 апреля 2011

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

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

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

2 голосов
/ 24 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...