Сбой при связывании Debug-CRT в смеси статических и динамических библиотек?

У меня есть странная проблема, где я страдаю от сбоев при удалении объектов в моем коде. Объекты действительны, нет утечек памяти, которые могли бы их перезаписать, и это происходит только в режиме отладки. Один и тот же код, скомпилированный с Linux, прекрасно работает как в отладочной, так и в выпускной сборках. Так что я предполагаю, что это какая-то странная проблема с отладочными CRT в Visual Studio.

Мое программное обеспечение структурировано следующим образом:

Две статические библиотеки компилируются в режиме "Многопоточная (отладочная) DLL" и связаны с: Общая библиотека (DLL), которая компилируется в режиме "Многопоточная (отладочная)". Из логики я бы сказал, что все должно быть наоборот, но тогда я получаю ОГРОМНОЕ количество неразрешенных символов.

Наконец, есть исполняемый файл, скомпилированный в режиме "Многопоточная (отладочная) DLL", который вызывает указанную выше DLL. Здесь не имеет значения, когда я переключаюсь на "Многопоточность (отладка)".

Сбой при удалении объекта происходит в dbgheap.c / _heap_alloc_dbg_impl() -> mlock.c / _unlock() - функция

Итак: в чем может быть проблема? Это действительно какая-то CRT-несовместимость в режиме отладки или в чем еще может быть причина? Я совершенно уверен, что это не типичная утечка памяти, так как она гладко работает с Linux и в сборке релиза.

1 ответ

Когда вы статически связываете библиотеки, вы должны обратить внимание на то, что вы используете одни и те же CRT-варианты.

Когда вы используете DLL:

затем вы можете использовать их из исполняемых файлов, созданных с различными вариантами CRT, или даже с использованием разных версий компилятора VC++.

Но если в ваших DLL есть классы C++ (например, классы STL) на границах, то существуют строгие ограничения, как и для библиотек со статическим связыванием, то есть вы должны использовать те же разновидности CRT (отладка или выпуск), которые динамически связаны для DLL и EXE и EXE и DLL должны быть собраны с одним и тем же компилятором и одинаковыми настройками (например, _HAS_ITERATOR_DEBUGGING).

Другие вопросы по тегам