Сбой при связывании Debug-CRT в смеси статических и динамических библиотек?
У меня есть странная проблема, где я страдаю от сбоев при удалении объектов в моем коде. Объекты действительны, нет утечек памяти, которые могли бы их перезаписать, и это происходит только в режиме отладки. Один и тот же код, скомпилированный с Linux, прекрасно работает как в отладочной, так и в выпускной сборках. Так что я предполагаю, что это какая-то странная проблема с отладочными CRT в Visual Studio.
Мое программное обеспечение структурировано следующим образом:
Две статические библиотеки компилируются в режиме "Многопоточная (отладочная) DLL" и связаны с: Общая библиотека (DLL), которая компилируется в режиме "Многопоточная (отладочная)". Из логики я бы сказал, что все должно быть наоборот, но тогда я получаю ОГРОМНОЕ количество неразрешенных символов.
Наконец, есть исполняемый файл, скомпилированный в режиме "Многопоточная (отладочная) DLL", который вызывает указанную выше DLL. Здесь не имеет значения, когда я переключаюсь на "Многопоточность (отладка)".
Сбой при удалении объекта происходит в dbgheap.c / _heap_alloc_dbg_impl() -> mlock.c / _unlock() - функция
Итак: в чем может быть проблема? Это действительно какая-то CRT-несовместимость в режиме отладки или в чем еще может быть причина? Я совершенно уверен, что это не типичная утечка памяти, так как она гладко работает с Linux и в сборке релиза.
1 ответ
Когда вы статически связываете библиотеки, вы должны обратить внимание на то, что вы используете одни и те же CRT-варианты.
Когда вы используете DLL:
если они предоставляют интерфейс на чистом C (например, на границах нет классов STL), и вы убедитесь, что выделение и освобождение памяти выполняются внутри кода библиотеки (или, в более общем случае, и клиент, и библиотека используют один и тот же распределитель)
или если они являются COM DLL
затем вы можете использовать их из исполняемых файлов, созданных с различными вариантами CRT, или даже с использованием разных версий компилятора VC++.
Но если в ваших DLL есть классы C++ (например, классы STL) на границах, то существуют строгие ограничения, как и для библиотек со статическим связыванием, то есть вы должны использовать те же разновидности CRT (отладка или выпуск), которые динамически связаны для DLL и EXE и EXE и DLL должны быть собраны с одним и тем же компилятором и одинаковыми настройками (например, _HAS_ITERATOR_DEBUGGING
).