Зачем нужен распространяемый пакет на неуправляемом коде? (Msvcp100.dll)

  • Какова цель "msvcrXXX.dll" и "msvcpXXX.dll"? И каковы различия между msvc r и msvc p?
  • Почему мне нужно связать их с моим двоичным файлом, если это просто очень простая и неуправляемая .dll? Это потому, что это часть компоновщика? Почему это не в системном каталоге Windows по умолчанию в качестве общей библиотеки?

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

Ответ 1

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

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

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

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

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