Введение: Знакомая боль каждого разработчика на Mac
Вы обновляли Node.js через Homebrew, запустили свой любимый PHP-скрипт — и вдруг видите это леденящее душу сообщение:
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
Referenced from: /usr/local/bin/php
Reason: image not found
Спокойствие, только спокойствие! Если вы попали на эту страницу, значит вы — не первый и не последний разработчик, столкнувшийся с этой ошибкой. На Stack Overflow этот вопрос собрал тысячи просмотров, и не зря: проблема возникает из-за конфликта версий библиотеки ICU4C (International Components for Unicode for C) после установки или обновления Node.js через Homebrew.
В этом туториале я покажу вам три рабочих способа исправить ошибку, объясню её корень и дам полезные рекомендации, чтобы вы больше никогда не видели это сообщение. Поехали!
Почему возникает ошибка dyld: Library not loaded?
Прежде чем бросаться исправлять, давайте разберёмся в причинах. Это поможет вам лучше понимать экосистему macOS и Homebrew.
Что такое ICU4C и при чём тут PHP?
ICU4C — это библиотека для поддержки Unicode, интернационализации и локализации. PHP использует её для работы с функциями вроде mb_convert_encoding(), intl расширением и другими. Homebrew устанавливает ICU4C как зависимость для многих пакетов, включая PHP и Node.js.
Цепочка событий, приводящая к ошибке
- Вы устанавливаете или обновляете Node.js через
brew install nodeилиbrew upgrade node. - Node.js требует определённую версию ICU4C (например, 62.x).
- Homebrew обновляет ICU4C до новой версии (например, 63.x или 64.x).
- Старая библиотека
libicui18n.62.dylibудаляется. - PHP, который был скомпилирован с версией 62, не может найти нужную библиотеку — и падает с ошибкой.
Проще говоря: PHP остался «в прошлом», а библиотеки уже «в будущем».
Способ 1: Быстрое решение — перелинковка ICU4C (рекомендую для новичков)
Это самый простой и быстрый способ, который в 90% случаев решает проблему.
Шаг 1: Проверьте текущую версию ICU4C
Откройте Терминал и выполните:
brew list --versions icu4c
Вы увидите что-то вроде icu4c 63.1 или 64.2. Запомните версию — она пригодится.
Шаг 2: Перелинкуйте ICU4C с PHP
Выполните команду для перелинковки:
brew link --force icu4c
Если вы видите предупреждение, что версии не совпадают — не пугайтесь. Это нормально. Затем перезапустите PHP:
which php
php -v
Если ошибка исчезла — вы молодец! Если нет — переходите к следующему способу.
Шаг 3: Альтернативный вариант — принудительная перелинковка
Если команда выше не сработала, попробуйте:
brew reinstall icu4c
brew link --overwrite icu4c
Это переустановит библиотеку и обновит все ссылки.
Способ 2: Переустановка PHP через Homebrew (для тех, кто любит чистоту)
Если перелинковка не помогла — значит, ваш PHP «зашит» под старую версию ICU4C. Лучшее решение — переустановить PHP.
Шаг 1: Удалите текущую версию PHP
brew uninstall php
Если у вас несколько версий PHP (например, 7.4 и 8.0), удалите все:
brew uninstall php@7.4 php@8.0
Шаг 2: Очистите кеш Homebrew
brew cleanup
Шаг 3: Установите PHP заново
brew install php
Или, если вам нужна конкретная версия:
brew install php@8.1
Шаг 4: Проверьте работоспособность
Напишите простой PHP-скрипт для проверки:
<?php
// test.php
echo "ICU version: " . INTL_ICU_VERSION . "\n";
echo "ICU data version: " . INTL_ICU_DATA_VERSION . "\n";
echo "PHP works!\n";
?>
Запустите:
php test.php
Если увидите версию ICU без ошибок — всё в порядке.
Способ 3: Использование совместимой версии ICU4C (для продвинутых)
Иногда проект требует старую версию PHP, а новая ICU4C несовместима. В этом случае можно установить конкретную версию ICU4C.
Шаг 1: Найдите нужную версию ICU4C
Посмотрите, какая версия ICU4C требуется вашему PHP:
php -i | grep "ICU version"
Допустим, это версия 62. Тогда:
brew search icu4c
Если нужной версии нет в репозитории, придётся установить из исходников или использовать brew extract.
Шаг 2: Установите конкретную версию (пример для версии 62)
brew tap homebrew/core
brew extract --version=62 icu4c homebrew/cask
Затем установите:
brew install icu4c@62
И прилинкуйте:
brew link --force icu4c@62
Важно: Этот способ сложнее и может потребовать дополнительных танцев с бубном. Используйте его только если первые два не сработали.
Профилактика: Как больше никогда не попадать в эту ловушку
Лучшая ошибка — та, которую вы предотвратили. Вот несколько советов:
- Используйте менеджеры версий. Для PHP —
phpbrewилиphpenv, для Node —nvm. Они изолируют версии библиотек. - Не обновляйте всё подряд. Перед
brew upgradeчитайте, что именно обновляется. Иногда лучше подождать. - Держите резервную