Вопрос по windows, dll – Должен ли я распространять msvcrt.dll с моим приложением?

30

Должен ли я распространять msvcrt.dll вместе с моим приложением и использовать частную dll, если некоторые из библиотек приложения динамически зависят от msvcrt.dll? То есть Возможны ли какие-либо проблемы несовместимости с системным msvcrt.dll (dll hell)? Приложение предназначено для систем Windows Server.

Я не собираюсь закрывать голосование, потому что существующие ответы важны, но читатели должны отметить, что этот вопрос недостаточно конкретизирован. На практике то, что вы должны сделать, зависит от того, какой компилятор вы используете, например, с MinGW, у вас нет реалистичного выбора, кроме как предположить, чтоmsvcrt.dll останется частью Windows. Harry Johnston

Ваш Ответ

4   ответа
24

must Отправьте msvcrt с вашим приложением. Это не гарантированная часть операционной системы. Если конкретная версия Windowshappens чтобы иметь это, это только потому, что что-то в Windows использует это.

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

ОтРаймонд Чен:

Depending on what version of Windows you're running, there may be a variety of support DLLs for things that aren't formal product components, but which are merely along for the ride.

...

This problem persists today. People go scrounging around the binaries that come with Windows looking for something they can remora. And then they're surprised when those binaries change or vanish entirely.

ОтKB326922 - Перераспределение общего компонента среды выполнения C в Visual C ++:

...the CRT DLL is no longer considered a system file, therefore, distribute the CRT DLL with any application that relies on it. Because it is no longer a system component, install it in your applications Program Files directory with other application-specific code. This prevents your application from using other versions of the CRT library that may be installed on the system paths.

must отправить MSVCRT с вашим приложением,if you link to MSVCRT.

More

the decision was made to just give up and declare it an operating system DLL, to be used only by operating system components.

Although MSVCRT.DLL has been an operating system DLL for a long time, and has been documented as off-limits to applications, there are still a lot of people who treat it as a C runtime delivery channel, and those programs create a lot of grief for the product team.

must распространять Microsoft Visual C Runtime вместе с вашим приложением, потому что Windows не поставляется с Microsoft Visual C Runtime. Там можетhappen быть DLL называетсяmsvcrt.dll (что не гарантируется), это неthe MSVCRT.

Error: User Rate Limit Exceededit is not guaranteed to be there. ("meaning that it is a system component owned and built by Windows. It is intended for future use only by system-level components.")Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmsvcrt.dllError: User Rate Limit Exceededshouldn'tError: User Rate Limit ExceededdoError: User Rate Limit Exceededmsvcrt.dllError: User Rate Limit Exceededmsvcrt.dllError: User Rate Limit Exceeded
Error: User Rate Limit Exceededmsvcrt.dllError: User Rate Limit Exceededmsvcrt.dllError: User Rate Limit Exceeded
5

msvcrt.dll стал дефактной частью дистрибутива ОС. На Windows 98 и 95 и, возможно, NT4 можно было получить установку ОС без нее, если кто-то попытался удалить приложения, такие как WordPad, из установки.

Однако, учитывая его повсеместное распространение, а также тот факт, что с тех пор очень немногие разработчики приложений пытались его выпустить, по крайней мере, с тех пор как Windows 2000 стала его официальной частью.

Поддержка Microsoft имеетинструмент что вы можете использовать для двойной проверки, какие продукты поставляются с DLL.

Выполнить поиск какэтот и вы можете видеть, что msvcrt.dll vsrsion 7.0.3790.0 был частью выпуска Windows Server 2003.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsupport.microsoft.com/kb/326922Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMFCError: User Rate Limit Exceeded.Net.
12

Ответ Криса не должен быть отклонен, потому что оба правы.

Дело в том, что существуют два разных набора MSVCRT. Один набор - это msvcrt80.dll, msvcrt90.dll и т. Д., Которые поставляются с Visual Studio. Это то, что люди обычно используют. И они должны быть перераспределены, как говорится в других ответах.

Другой - это msvcrt.dll (без номеров в имени файла) в папке System32, которая должна использоваться ТОЛЬКО самой ОС некоторое время назад. И приложения никогда не должны заменять / переустанавливать его. Однако некоторые приложения ссылаются на него, по некоторым причинам, например, для удаления дополнительных зависимостей для установки. Но имейте в виду, что он не гарантированно будет доступен в будущей версии Windows.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
31

msvcrt - это динамическая библиотека для среды выполнения Microsoft Visual C ++.

Существует два варианта использования среды выполнения C в Windows:

  1. link with static runtime libs.
    Use either the /MT or the /MTd option to cl.exe. In this case, you will have no dependency on the msvcrt DLL, and therefore you will not have to redistribute it. In Visual Studio, right click on the Project or Solution, Properties > C/C++->Code Generation->Runtime library use Multithreaded and Multithreaded debug respectively. This is the easier way. The downside is that the resulting executable is larger.

  2. link with the dynamic C Runtime library.
    You will use either the /MD or the /MDd option to cl.exe.
    In Visual Studio, right click on the Project or Solution, Properties > C/C++->Code Generation->Runtime library use Multithreaded Dynamic Link and Multithreaded Dynamic Link debug respectively. This results in a smaller EXE, but the downside is that you must install the required MSVCRT when installing your application.


Каждый выпуск компилятора VC ++ поставляется с версией среды выполнения C (CRT). Visual Studio 2005 поставляется с версией компилятора v8 и версией CRT v8. Фактическая DLL для v8 была msvcrt80.dll. Для VS2008 это был v9, а динамический CRT был msvcrt90.dll. Но CRT обновляется и исправляется чаще, чем компилятор C / C ++. Разработчик может загрузить обновленную ЭЛТ и использовать ее.

Если вы компилируете с динамической библиотекой CRT, выMUST загрузите распространяемый пакет для необходимой версии среды выполнения с сайта microsoft.com и выполните его (потенциально тихую) установку во время установки приложения.


До VS2005 разработчики создавали приложения в зависимости от MSVCRT, который был в операционной системе Windows. Это дало бы преимущество DLL (небольшой размер изображения), не требуя при этом доставки CRT DLL при установке приложения. До выпуска Windoes 2000 разработчики даже устанавливали новый MSVCRT.dll в папку установки \ Windows. Но совместное использование ЭЛТ во многих приложениях и ОС тоже оказалось очень плохой идеей. В WinXP SP2 CRT, включенный в Windows, значительно изменился, и любые приложения, которые зависели от этой версии CRT, были подвержены риску взлома.

В этот момент Microsoft сообщает разработчикам, что MSVCRT.dll, входящий в состав Windows, является частью ОС и может быть отремонтирован или исправлен в любое время. Не поддерживается создание приложения против него. Поэтому приложения должны использовать один из методов выше.

Рекомендации:

Похожие вопросы