Зачем мне нужен распространяемый пакет для неуправляемого кода? (Msvcp100.dll) - PullRequest
14 голосов
/ 21 ноября 2011
  1. Для чего нужны «msvcr XXX .dll» и «msvcp XXX .dll»? И в чем различия между msvc r и msvc p ?
  2. Зачем мне связывать их с моим двоичным файлом, если это просто очень простой и неуправляемый .dll? Это потому что это часть компоновщика? Почему он не находится в системном каталоге Windows по умолчанию как общая библиотека?

Я просто пытаюсь понять, почему в Windows есть такие сложные вещи ...

1 Ответ

33 голосов
/ 21 ноября 2011

msvcrXXXX.dll - это DLL для библиотеки времени выполнения C. msvcpXXXX.dll - это библиотека DLL для библиотеки времени выполнения C ++.

Одна или обе эти зависимости будут добавлены в ваш двоичный файл, если вы строите с использованием / MD или / MDd, которые являются значениями по умолчанию, указанными Visual Studio при создании нового проекта C ++. Использование любого из этих флагов означает, что вы хотите, чтобы ваша программа связывалась с версией DLL среды выполнения C / C ++. Вы можете изменить значения по умолчанию в Свойствах проекта-> Свойства конфигурации-> C / C ++ / Генерация кода / Библиотека времени выполнения.

Если вы измените свой проект на использование / MT или / MTd, то ваше приложение не будет генерировать ссылки ни на одну из перечисленных выше библиотек DLL, поскольку среды выполнения C / C ++ будут связаны непосредственно с вашей программой. Для большинства простых программ это не вызовет никаких проблем. Однако, если ваша программа разбита на несколько библиотек DLL, все из которых построены с использованием этих флагов, то каждая библиотека DLL будет хранить копию ссылочных функций CRT и статических данных, и вы можете столкнуться с проблемами выделения / освобождения памяти. Чтобы избежать этого, вам нужно убедиться, что объекты, размещенные в данной DLL, также освобождены в этом же модуле.

В целом, более эффективно использовать флаги / MD и / MDd для приложений, которые имеют несколько модулей (DLL), потому что все эти модули будут совместно использовать одну копию библиотек времени выполнения C / C ++ и связанных с ними данных структуры в процессе подачи заявки.

Для простых одно-модульных приложений, не стесняйтесь создавать с использованием / MT или /MTd.

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