Должен ли я распространять msvcrt.dll с моим приложением?
Должен ли я распространять msvcrt.dll с моим приложением и использовать частную dll, если некоторые из библиотек приложения динамически зависят от msvcrt.dll? Т.е. возможны ли какие-либо проблемы несовместимости с системным msvcrt.dll (dll hell)? Приложение предназначено для систем Windows Server.
4 ответа
msvcrt - это динамическая библиотека для среды выполнения Microsoft Visual C++.
Существует два варианта использования среды выполнения C в Windows:
ссылка со статическими исполняемыми библиотеками.
Используйте либо/MT
или/MTd
вариант к cl.exe. В этом случае вы не будете зависеть от библиотеки msvcrt, и, следовательно, вам не придется распространять ее. В Visual Studio щелкните правой кнопкой мыши Проект или Решение, Свойства> C/C++-> Генерация кода-> Библиотека времени выполнения, используя многопоточную и многопоточную отладку соответственно. Это более простой способ. Недостатком является то, что полученный исполняемый файл больше.связь с динамической библиотекой C Runtime.
Вы будете использовать либо/MD
или/MDd
вариант к cl.exe.
В Visual Studio щелкните правой кнопкой мыши Проект или Решение, Свойства> C/C++-> Генерация кода-> Библиотека времени выполнения, используя многопоточную динамическую ссылку и многопоточную динамическую ссылку отладки соответственно. Это приводит к уменьшению размера EXE, но недостатком является то, что вы должны установить необходимый MSVCRT при установке приложения.
Каждый выпуск компилятора VC++ поставляется с версией среды выполнения C (CRT). Visual Studio 2005 поставляется с версией компилятора v8 и версией CRT v8. Фактическая DLL для v8 была msvcrt80.dll. Для VS2008 это был v9, а динамический CRT был msvcrt90.dll. Но CRT обновляется и исправляется чаще, чем компилятор C / C++. Разработчик может загрузить обновленную ЭЛТ и использовать ее.
Если вы компилируете с динамической библиотекой CRT, вы ДОЛЖНЫ загрузить распространяемый пакет для необходимой версии среды выполнения с microsoft.com и выполнить его (возможно, без вывода сообщений) во время установки приложения.
До VS2005 разработчики создавали приложения для зависимости от MSVCRT, который был в операционной системе Windows. Это дало бы преимущество DLL (небольшой размер изображения), не требуя при этом доставки CRT DLL при установке приложения. До выпуска Windoes 2000 разработчики даже устанавливали новый MSVCRT.dll в папке установки \Windows. Но совместное использование ЭЛТ во многих приложениях и ОС тоже оказалось очень плохой идеей. С WinXP SP2, CRT, включенный в Windows, значительно изменился, и любые приложения, которые зависели от этой версии CRT, были подвержены риску взлома.
В этот момент Microsoft сообщает разработчикам, что MSVCRT.dll, входящий в состав Windows, является частью ОС и может быть отремонтирован или исправлен в любое время. Не поддерживается создание приложения против него. Поэтому приложения должны использовать один из методов выше.
Рекомендации:
Вы должны отправить msvcrt вместе с вашим приложением. Это не гарантированная часть операционной системы. Если у конкретной версии Windows она есть, то только потому, что ее использует что-то в Windows.
Приложения перестали работать, когда в более новых версиях Windows не оказалось двоичных файлов, которые, как предполагалось, были в комплекте с Windows. Приложения сломались, когда пользователь решил не устанавливать WinFax, что означало, что msvcrt не был установлен с ним.
От Рэймонда Чена:
В зависимости от того, какую версию Windows вы используете, могут существовать различные библиотеки поддержки DLL для вещей, которые не являются формальными компонентами продукта, но которые просто готовы к поездке.
...
Эта проблема сохраняется и сегодня. Люди бродят по бинарным файлам, которые поставляются с Windows, в поисках чего-то, что они могут перезаписать. И затем они удивляются, когда эти двоичные файлы изменяются или полностью исчезают.
От KB326922 - Перераспределение общего компонента времени выполнения C в Visual C++:
... DLL-библиотека CRT больше не считается системным файлом, поэтому распространяйте DLL-библиотеку CRT вместе с любым приложением, которое на нее опирается. Поскольку он больше не является системным компонентом, установите его в каталоге программных файлов приложений с другим кодом, специфичным для приложения. Это не позволяет вашему приложению использовать другие версии библиотеки CRT, которые могут быть установлены по системным путям.
Вы должны отправить msvcrt вместе со своим приложением, если вы ссылаетесь на MSVCRT.
Больше
было принято решение просто отказаться и объявить ее библиотекой операционной системы, которая будет использоваться только компонентами операционной системы.
Хотя
MSVCRT.DLL
долгое время была библиотекой операционной системы и была задокументирована как запретная для приложений, все еще есть много людей, которые рассматривают ее как канал доставки времени выполнения C, и эти программы создают много горя для продукта команда.
Вы должны распространять Microsoft Visual C Runtime вместе с вашим приложением, поскольку Windows не поставляется с Microsoft Visual C Runtime. Может случиться так, что DLL называется msvcrt.dll
(что не гарантируется), это не MSVCRT.
Ответ Криса не должен быть отклонен, потому что оба правы.
Дело в том, что существует два разных набора MSVCRT. Один набор - это msvcrt80.dll, msvcrt90.dll и т. Д., Которые поставляются с Visual Studio. Это то, что люди обычно используют. И они должны быть перераспределены, как говорится в других ответах.
Другой - это msvcrt.dll (без номеров в имени файла) в папке System32, которая должна использоваться ТОЛЬКО самой ОС некоторое время назад. И приложения никогда не должны заменять / переустанавливать его. Однако некоторые приложения ссылаются на него по некоторым причинам, например, для удаления дополнительных зависимостей для установки. Но имейте в виду, что он не гарантированно будет доступен в будущей версии Windows.
msvcrt.dll стала дефактной частью дистрибутива ОС. На Windows 98 и 95 и, возможно, NT4 можно было получить установку ОС без него, если кто-то попытался удалить приложения, такие как WordPad, из установки.
Однако, учитывая его повсеместное распространение, а также тот факт, что с тех пор очень немногие разработчики приложений пытались его выпустить, по крайней мере, с тех пор, как Windows 2000 стала его официальной частью.
Служба поддержки Microsoft имеет инструмент, который можно использовать для двойной проверки того, с какими продуктами поставляются библиотеки DLL.
Выполните такой поиск, и вы увидите, что msvcrt.dll vsrsion 7.0.3790.0 был частью выпуска Windows Server 2003.