Что такое опция "Многопоточная отладка DLL" в VS 2008?

У меня есть решение в VS 2008, которое создает DLL. Затем я использую эту DLL в другом приложении. Если я перейду к страницам свойств проектов DLL и изменим следующую конфигурацию для сборки DEBUG, тогда построенная dll не даст требуемой функциональности. Если я изменил его и перестроил DLL, DLL действительно обеспечит правильную функциональность:

Страницы свойств = > Свойства конфигурации = > C/С++ = > Генерация кода = > Библиотека времени выполнения

Если установлено значение "Многопоточная отладка DLL (/MDd)" то все работает так, как должно. Я получаю правильную функциональность из DLL

Если установлено значение "Многопоточная DLL (/MD)" , тогда DLL не работает должным образом... никаких ошибок во время выполнения или чего-то еще, t work (DLL должна накладывать некоторые строки на карте, но не в этом режиме).

Итак, вопрос в том, почему использование флага /MDd приводит к функциональности коррекции базового кода, в то время как /MD приводит к неправильной функциональности?

Немного фона... кто-то другой разработал DLL на С++, и я использую эту DLL в приложении VB.net.

Ответы

Ответ 1

Вся генерация кода DLL/отладки должна соответствовать всем используемым им. Там может быть другая ссылка на библиотеку, объект или dll или какой-либо код там, который построен с использованием неправильных опций; или конкретные параметры для отдельного элемента, которые переопределяют параметры глобального проекта.

Единственный способ понять это - тщательно проверять все параметры для каждого файла, проверять включенные и ссылающиеся библиотеки (.lib и .dll) и объектные файлы. Проверьте также параметры компоновщика.

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

Ответ 2

Основное различие между двумя параметрами заключается в том, что библиотеки будут связаны позже. для отладочной версии, например, это будет LIBCMTD.LIB и несколько других. если ваша библиотека будет построена как debug, вы всегда должны ссылаться на MDd. неспособность сделать это приведет к большому количеству нерешенных внешних ошибок компоновщика в лучшем случае. и иногда код компилируется нормально, но сбой во время выполнения. если это происходит в vb.net, тогда улов может легко скрыть ошибку. Я думаю, вы должны убедиться, что вы построили настройку правильно. для более подробной информации проверьте this.

Ответ 3

У меня были подобные проблемы. Мое приложение, которое "использовало" стороннюю DLL, разбилось, когда его библиотека времени исполнения была настроена на "многопотоковая DLL (/MD)", но работала, когда в ее библиотеке времени исполнения была установлена ​​ "многопоточная Debug DLL (/MDd)".

Это как-то связано с передачей std:: strings и std:: lists через интерфейс DLL.

Наше предположение заключалось в том, что определение этих типов на низком уровне было каким-то иным образом в двух библиотеках времени исполнения.

Мы решили наши связанные проблемы, используя это правило... DLL и DLL-пользователь должны быть созданы с использованием той же самой библиотеки времени выполнения.