Что такое опция "Многопоточная отладка 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-пользователь должны быть созданы с использованием той же самой библиотеки времени выполнения.