Wine C Runtime Library: что это и как исправить ошибки

Ошибка вида MSVCRT: unimplemented function или падение программы с упоминанием msvcrt.dll — типичный признак того, что приложению в Wine не хватает нужной версии библиотеки Wine C Runtime Library, либо встроенная реализация конфликтует с ожиданиями конкретной программы. Часто это проявляется при запуске старых игр, офисных пакетов или специализированного софта, собранного под определённую версию Visual C++.

Разберёмся, что представляет собой этот компонент, почему возникают сбои и как безопасно их устранить без переустановки всего префикса Wine. Инструкции ниже подходят для большинства дистрибутивов Linux, но точные названия пакетов могут отличаться — сверяйтесь с документацией вашей системы.

Что такое Wine C Runtime Library

Wine C Runtime Library — это реализация стандартной библиотеки времени выполнения языка C (CRT) внутри Wine. В Windows этот набор функций поставляется в виде библиотек msvcrt.dll и семейства MSVCR/MSVCP (например, msvcr100.dll, msvcp140.dll), которые устанавливаются пакетами Visual C++ Redistributable от Microsoft.

Wine включает собственную версию этих библиотек, чтобы Windows-программы могли работать без оригинальных файлов Microsoft. Однако встроенная реализация не всегда покрывает все функции конкретных версий CRT — отсюда и ошибки.

  • 🧩 msvcrt.dll — базовая библиотека CRT, присутствует в Wine по умолчанию.
  • 📦 msvcr80/90/100/120/140 — версии CRT для конкретных выпусков Visual Studio.
  • ⚙️ ucrtbase.dll — универсальная CRT, используемая современными приложениями.
  • 🔧 vcruntime140.dll и msvcp140.dll — часто требуются программам, собранным в Visual Studio 2015 и новее.

Типичные симптомы проблем с CRT в Wine

Распознать проблему с библиотекой времени выполнения можно по характерным сообщениям в терминале или в окне ошибки программы. Запустите приложение из консоли командой wine program.exe, чтобы увидеть диагностический вывод.

  • ❌ Сообщение err:module:import_dll Library msvcrXXX.dll not found — нужной DLL нет в префиксе.
  • ❌ Строка fixme:msvcr:... unimplemented function — функция есть, но не реализована полностью.
  • ❌ Ошибка «Runtime Error» или аварийное завершение сразу после старта программы.
  • ❌ Сбой при вызове конкретных функций: работа с файлами, локалью, математическими операциями.

Важно не путать эти ошибки с проблемами DirectX или драйверов: если в логе фигурируют именно файлы msvcr, msvcp, vcruntime или ucrtbase, дело почти наверняка в CRT.

📊 С какой ошибкой Wine CRT вы сталкивались?
DLL не найдена (msvcrXXX not found)
Unimplemented function в логе
Runtime Error при запуске
Программа молча закрывается

Диагностика: как найти проблемную библиотеку

Прежде чем что-то устанавливать, определите, какая именно библиотека вызывает сбой. Самый надёжный способ — включить подробное логирование Wine:

WINEDEBUG=+loaddll wine program.exe 2>&1 | grep -i msvcr

Эта команда покажет, какие DLL загружаются и откуда — из встроенных компонентов Wine (builtin) или из нативных файлов Windows (native). Если программа пытается загрузить msvcr120.dll, а её нет в префиксе, вы сразу это увидите.

Дополнительно проверьте содержимое каталога ~/.wine/drive_c/windows/system32/ — там должны лежать установленные библиотеки. Отсутствие нужной версии подтверждает диагноз.

Установка нужных библиотек через Winetricks

Самый безопасный и распространённый способ закрыть потребность в конкретной версии CRT — установить официальные пакеты Visual C++ Redistributable через Winetricks. Утилита сама скачивает дистрибутивы Microsoft и корректно регистрирует библиотеки в префиксе.

winetricks vcrun2019

winetricks vcrun2013

winetricks vcrun2010

Выбирайте версию, соответствующую году сборки программы: vcrun2019 покрывает msvcp140/vcruntime140 для приложений Visual Studio 2015–2022, vcrun2013 — для msvcr120 и так далее. Если версия неизвестна, начните с самой свежей.

☑️ Порядок установки CRT через Winetricks

Выполнено: 0 / 5

⚠️ Внимание: команды Winetricks применяются к префиксу, указанному в переменной WINEPREFIX. Если пользуетесь несколькими префиксами (например, через Lutris или Bottles), убедитесь, что устанавливаете библиотеки именно в тот префикс, где лежит проблемная программа.

Настройка переопределения библиотек

Иногда нативная DLL установлена, но Wine продолжает использовать свою встроенную версию. Это исправляется через переопределение библиотек в утилите winecfg на вкладке «Библиотеки»: добавьте нужную DLL и задайте режим «сторонняя, затем встроенная» (native, builtin).

То же самое можно сделать из терминала без графического интерфейса:

wine reg add 'HKCU\Software\Wine\DllOverrides' /v msvcp140 /d native,builtin /f

Обратная ситуация тоже встречается: нативная библиотека конфликтует с программой, и помогает переключение на встроенную (builtin). Экспериментируйте с режимами по одной библиотеке, проверяя результат после каждого изменения.

Почему встроенная CRT иногда работает лучше нативной

Встроенные библиотеки Wine тесно интегрированы с остальными компонентами слоя совместимости. Нативные DLL от Microsoft могут вызывать функции Windows, которые Wine реализует не полностью, что приводит к новым ошибкам. Поэтому универсального правила «всегда native» нет — оптимальный режим подбирается для каждой программы.

Сравнение способов решения проблемы

МетодКогда применятьСложностьРиски
Winetricks (vcrunXXXX)DLL отсутствует в префиксеНизкаяМинимальные
Переопределение в winecfgКонфликт builtin/native версийНизкаяОбратимо в один клик
Ручное копирование DLLЭкзотические версии библиотекСредняяНесовпадение разрядности
Новый чистый префиксМножественные конфликтыСредняяНужно переустановить программы

Разрядность префикса и частые ошибки

Отдельный источник проблем — несовпадение разрядности. 32-битная программа требует 32-битных версий CRT, и наоборот. Префикс Wine по умолчанию поддерживает оба типа (WoW64), но если вы создавали чисто 64-битный префикс через WINEARCH=win64, старые 32-битные приложения могут работать некорректно.

⚠️ Внимание: не копируйте DLL из установленной Windows или с посторонних сайтов вручную без крайней необходимости. Такие файлы могут не подходить по версии и разрядности, а загрузка библиотек из непроверенных источников — прямой риск для безопасности системы.

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

Часто задаваемые вопросы

Что означает ошибка «msvcrXXX.dll not found» в Wine?

Программе нужна конкретная версия библиотеки Visual C++ Runtime, которой нет в текущем префиксе Wine. Решение — установить соответствующий пакет через winetricks vcrunXXXX, где XXXX — год версии Visual Studio.

Чем отличаются msvcr, msvcp и vcruntime?

msvcr — библиотека функций языка C, msvcp — библиотека стандартных классов C++, vcruntime — вспомогательный компонент времени выполнения. Приложениям часто нужны все три файла одной версии, поэтому Winetricks устанавливает их комплектом.

Можно ли обойтись без установки нативных библиотек Microsoft?

Иногда да: встроенные реализации Wine постоянно улучшаются, и многие программы работают на них без проблем. Если же в логе видны unimplemented function или сбои, без нативного пакета Redistributable обойтись не получится.

Почему после установки vcrun программа всё равно не запускается?

Проверьте режим библиотеки в winecfg — возможно, Wine использует встроенную версию вместо установленной. Также убедитесь, что библиотеки установлены в тот же префикс, где находится программа, и что разрядность приложения соответствует установленным DLL.

Нужно ли устанавливать все версии Visual C++ Redistributable сразу?

Не обязательно. Устанавливайте только те версии, которые требует конкретная программа — это видно из лога Wine. Лишние пакеты не навредят, но и пользы без запроса от приложения не принесут.