Ошибка «cannot import dll» в Wine на Linux: причины и решение

Сообщение вида cannot import dll или err:module:import_dll в терминале при запуске Windows-программы через Wine означает, что слой совместимости не смог загрузить одну из динамических библиотек, необходимых приложению. Упоминание utf8 в тексте ошибки обычно связано либо с именем файла библиотеки, содержащим не-ASCII символы, либо с тем, что программа пытается подгрузить библиотеку, чей путь Wine не может корректно обработать в текущей локали системы.

Проблема почти всегда решается без переустановки системы: нужно выяснить, какая именно DLL не загружается, проверить локаль и архитектуру префикса, а затем устранить конкретную причину. Ниже разберём диагностику по шагам и рабочие способы исправления.

Что означает эта ошибка

Wine подменяет системные библиотеки Windows собственными реализациями, но многие программы приносят с собой собственные DLL или требуют компоненты вроде Visual C++ Redistributable. Когда загрузчик не находит нужную библиотеку или не может её обработать, в терминал выводится строка об ошибке импорта, а приложение завершается или падает.

Хвост utf8 в сообщении чаще всего указывает на одну из двух ситуаций. Первая — в пути к программе или к самой DLL есть кириллица или другие символы вне ASCII, а локаль системы не настроена на UTF-8. Вторая — программа (например, собранная на Python или использующая определённые рантаймы) пытается обратиться к библиотеке, связанной с кодировками, и Wine не находит подходящую реализацию.

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

Шаг 1. Получаем полный лог ошибки

Запустите проблемную программу из терминала, чтобы увидеть весь вывод Wine. Откройте консоль в папке с приложением и выполните:

wine ./program.exe 2>&1 | tee wine_log.txt

Команда сохранит весь вывод в файл wine_log.txt, который удобно изучить. Ищите строки, начинающиеся с err:module:import_dll или содержащие cannot import. Рядом будет указано имя библиотеки — например, конкретный файл .dll и функция, которую программа пыталась из неё вызвать.

Если вывода слишком много, отфильтруйте его:

grep -i "import_dll\|cannot import\|err:" wine_log.txt

Запишите точное имя проблемной DLL — от этого зависят все дальнейшие действия. Без него исправление превращается в перебор наугад.

Шаг 2. Проверяем локаль и пути с кириллицей

Поскольку ошибка упоминает utf8, первым делом проверьте системную локаль. Выполните в терминале команду locale и убедитесь, что основные переменные (например, LANG) указывают на локаль с UTF-8, например ru_RU.UTF-8 или en_US.UTF-8.

Дополнительно проверьте, нет ли в пути к программе символов кириллицы, пробелов в нестандартных местах или иероглифов. Возможная причина сбоя — папка вида /home/user/Игры/Программа/: некоторые приложения и их установщики некорректно обрабатывают такие пути даже при правильной локали.

  • 🔤 Проверьте вывод команды locale — все ключевые переменные должны ссылаться на локаль с UTF-8
  • 📁 Переместите программу в папку с путём только из латинских букв, например ~/apps/program/
  • 🔍 Убедитесь, что имя самого исполняемого файла и лежащих рядом DLL не содержит не-ASCII символов
  • 🧪 Попробуйте запуск с явным указанием локали: LANG=en_US.UTF-8 wine program.exe
⚠️ Внимание: не переименовывайте системные библиотеки внутри префикса Wine и не меняйте системную локаль глобально, если не уверены в последствиях. Сначала тестируйте запуск с переменной окружения LANG только для конкретной команды — это полностью обратимо.

Шаг 3. Проверяем архитектуру префикса и зависимости

Ещё одна частая причина — несовпадение архитектуры. 32-битная программа не сможет работать с библиотеками из 64-битного префикса и наоборот. Проверьте, для какой архитектуры создан ваш префикс, и какие разрядности требует приложение.

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

ПроверкаКоманда / действиеЧто должно получиться
Локаль системыlocaleЛокаль с суффиксом UTF-8
Версия Winewine --versionАктуальная стабильная версия
Архитектура префиксаWINEPREFIX=... wine winecfgСоответствие разрядности программы
Имя проблемной DLLgrep import_dll wine_log.txtКонкретный файл .dll
32-битные библиотекиДокументация дистрибутиваУстановлены и доступны загрузчику
📊 На каком этапе возникает ошибка cannot import dll у вас?
Сразу при запуске программы
Во время установки приложения
После обновления Wine или системы
Только для одной конкретной программы

Шаг 4. Доустанавливаем недостающие компоненты

Если лог показал конкретную DLL, определите, к какому пакету она относится. Библиотеки семейства Visual C++ (их имена обычно содержат msvcr, msvcp, vcruntime) ставятся через установщики redistributable или через winetricks. Системные библиотеки Windows часто уже есть в Wine, но иногда требуется заменить встроенную реализацию на «родную».

Утилита winetricks автоматизирует установку типовых компонентов в префикс. Пример установки распространённых рантаймов:

winetricks vcrun2019 corefonts

Набор доступных компонентов и их названия могут меняться между версиями winetricks — актуальный список смотрите командой winetricks dlls list. После установки компонента перезапустите программу и снова проверьте лог: исчезла ли строка про import.

☑️ Порядок устранения ошибки cannot import dll

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

Шаг 5. Настройка переопределений библиотек в winecfg

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

Меняйте переопределения по одному и после каждого изменения тестируйте запуск. Так вы точно поймёте, какое действие помогло, и сможете откатить лишнее. Если сторонняя DLL отсутствует в префиксе, режим «сторонняя» не сработает — сначала библиотеку нужно туда установить.

⚠️ Внимание: не скачивайте DLL со случайных сайтов-каталогов библиотек — это риск получить заражённый или несовместимый файл. Берите библиотеки из официальных установщиков (redistributable, установщик самой программы) или через winetricks.
Как работает подмена DLL в Wine

Wine ищет библиотеку сначала согласно настройкам переопределений в winecfg, затем в папке программы и в системных каталогах префикса (system32/syswow64). Встроенные реализации Wine написаны с нуля и покрывают не все функции Windows API. Если программе нужна функция, которой нет во встроенной DLL, возникает ошибка импорта. Режим «native, builtin» заставляет сначала искать сторонний файл, а при его отсутствии использовать встроенный.

Шаг 6. Чистый префикс и обновление Wine

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

WINEPREFIX=~/wine_clean winecfg

WINEPREFIX=~/wine_clean wine setup.exe

Также проверьте версию Wine командой wine --version. В старых версиях встречаются ошибки загрузчика, исправленные в более свежих выпусках. Обновляйте Wine штатными средствами вашего дистрибутива или из официального репозитория проекта WineHQ. После обновления префикс иногда требуется пересоздать, так как его внутренняя структура обновляется автоматически не всегда корректно.

  • 🧹 Создайте отдельный чистый префикс для проблемной программы
  • ⬆️ Обновите Wine до актуальной стабильной ветки
  • 🔁 Переустановите программу в новый префикс, а не копируйте старый
  • 🧩 Проверьте приложение в базе совместимости AppDB на сайте WineHQ — там часто описаны нужные компоненты и обходные пути для конкретных программ

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

Что значит строка err:module:import_dll в выводе Wine?

Это диагностическое сообщение загрузчика Wine о том, что программа запросила функцию из DLL, которую не удалось найти или загрузить. В строке обычно указаны имя библиотеки и функции — по ним определяется, какой компонент нужно установить.

Причём здесь utf8, если ошибка про DLL?

Упоминание utf8 обычно указывает на проблему с кодировкой пути или имени файла (кириллица в каталоге программы при неверной локали) либо на конкретную библиотеку, связанную с обработкой кодировок. Проверьте локаль командой locale и перенесите программу в путь из латинских символов.

Можно ли просто скопировать недостающую DLL из Windows?

Технически — иногда да, если поместить файл рядом с программой или в system32 префикса и задать переопределение в winecfg. Но безопаснее использовать официальные установщики компонентов или winetricks: случайные DLL из интернета могут быть несовместимы или вредоносны.

Ошибка появилась после обновления системы. Что делать?

Проверьте, не сломались ли 32-битные библиотеки и зависимости Wine при обновлении, переустановите Wine штатным пакетным менеджером и попробуйте запуск в чистом префиксе. Если ошибка ушла в чистом префиксе — проблема была в конфигурации старого.

Поможет ли запуск через Proton или другую сборку Wine?

Для игр вариант с Proton (через Steam) или альтернативными сборками вроде Wine-GE иногда решает проблему, так как там уже включены дополнительные компоненты и патчи. Для прикладных программ надёжнее настроить обычный Wine с нужными библиотеками через winetricks.