Что именно делает библиотека времени выполнения «Многопоточная отладочная DLL» в VS 2008? - PullRequest
17 голосов
/ 30 марта 2010

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

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 30 марта 2010

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

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

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

6 голосов
/ 02 февраля 2011

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

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

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

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

6 голосов
/ 30 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...