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

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

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

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

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

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

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


person Elmi    schedule 11.04.2013    source источник
comment
Измените параметры компиляции совместно используемой библиотеки (DLL) на многопоточную отладочную DLL (переключатель компилятора /MDd). Настройки CRT должны быть одинаковыми для каждой из ваших библиотек и .EXE.   -  person Mr.C64    schedule 11.04.2013


Ответы (1)


При статическом связывании библиотек необходимо следить за тем, чтобы использовались одинаковые "разновидности" CRT.

При использовании DLL:

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

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

person Mr.C64    schedule 11.04.2013