Как исправить dyld: Library not loaded: libicui18n.62.dylib на Mac после установки Node через Brew

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Вступление: когда PHP перестаёт дружить с Homebrew

Вы когда-нибудь сталкивались с ситуацией, когда всё работало идеально, а потом — бац! — и ваш любимый PHP-скрипт выдаёт ошибку, от которой волосы дыбом? Если вы разработчик на macOS и недавно устанавливали Node.js через Homebrew, то наверняка видели это грозное сообщение:

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/bin/php
  Reason: image not found

Не паникуйте! Это не конец света, а всего лишь конфликт версий библиотеки ICU4C (International Components for Unicode for C). Ситуация настолько распространённая, что на Stack Overflow этот вопрос собрал тысячи просмотров. Сегодня мы разберёмся, почему это происходит, и, главное, как это исправить раз и навсегда.

Почему возникает ошибка libicui18n.62.dylib?

Давайте разберём механику. ICU4C — это библиотека для поддержки Unicode, которую использует PHP для работы с интернационализацией (функции вроде intl, mbstring и другие). Когда вы устанавливаете PHP через Homebrew, он привязывается к конкретной версии ICU4C, которая была актуальна на момент установки.

Проблема возникает, когда вы устанавливаете (или обновляете) Node.js через Brew. Node.js тоже зависит от ICU4C, и Brew может обновить эту библиотеку до новой версии, удалив старую. В результате PHP остаётся с «мёртвой ссылкой» на файл libicui18n.62.dylib, которого больше не существует. Отсюда и ошибка:

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib

По сути, это классический конфликт зависимостей. Но хорошая новость: решение есть, и оно довольно простое.

Способы решения: от простого к надёжному

Способ 1: Перелинковка ICU4C (быстрый фикс)

Самый быстрый способ — «напомнить» PHP, где теперь лежит библиотека. Homebrew хранит текущую версию ICU4C в другом месте, но мы можем создать символическую ссылку.

  1. Сначала узнайте, какая версия ICU4C установлена сейчас:
brew list --versions icu4c

Вы увидите что-то вроде icu4c 72.1 (номер версии может отличаться).

  1. Теперь давайте создадим директорию, которую ищет PHP, и сделаем симлинк:
sudo mkdir -p /usr/local/opt/icu4c/lib
sudo ln -s /usr/local/Cellar/icu4c/72.1/lib/libicui18n.dylib /usr/local/opt/icu4c/lib/libicui18n.62.dylib

Важно: Замените 72.1 на вашу версию ICU4C. Если версия 73.0, команда будет выглядеть так:

sudo ln -s /usr/local/Cellar/icu4c/73.0/lib/libicui18n.dylib /usr/local/opt/icu4c/lib/libicui18n.62.dylib

Проверьте, работает ли PHP:

php -v

Если видите версию PHP без ошибок — ура, вы победили! Но это временное решение. При следующем обновлении ICU4C ссылка снова сломается.

Способ 2: Переустановка PHP через Brew (рекомендуемый)

Более правильный подход — заставить PHP пересобраться с актуальной версией ICU4C. Это займёт чуть больше времени, но решит проблему на корню.

  1. Сначала удалите текущую версию PHP (если она есть):
brew uninstall php
  1. Затем переустановите PHP, явно указав, что нужно использовать текущую версию ICU4C:
brew install php

Homebrew сам подтянет последнюю версию ICU4C и пересоберёт PHP с правильными ссылками. После установки проверьте:

php -v
php -m | grep intl

Модуль intl должен быть в списке. Если нет — возможно, потребуется включить его вручную в php.ini, но обычно Brew делает это автоматически.

Способ 3: Установка конкретной версии ICU4C (для сложных случаев)

Иногда бывает, что ваш проект использует старую версию PHP (например, 7.4), которая несовместима с новейшей ICU4C. В таком случае можно установить старую версию ICU4C параллельно.

Проверьте, есть ли нужная версия в Homebrew:

brew search icu4c

Если нужной версии нет в официальном репозитории, можно установить её из бочонка (tap):

brew tap homebrew/cask-versions
brew install icu4c@62

Но учтите: этот метод — костыль. Лучше обновить PHP до версии, совместимой с актуальной ICU4C.

Пример кода: как проверить работу ICU4C в PHP

После исправления ошибки давайте убедимся, что библиотека работает корректно. Вот простой PHP-скрипт для проверки:

<?php
// Проверка версии ICU4C
echo "Версия ICU4C: " . INTL_ICU_VERSION . "\n";

// Проверка работы с Unicode
$locale = 'ru_RU';
$formatter = new NumberFormatter($locale, NumberFormatter::DECIMAL);
echo "Число 1234567.89 в русском формате: " . $formatter->format(1234567.89) . "\n";

// Проверка коллации (сравнения строк)
$collator = new Collator($locale);
$result = $collator->compare("ёлка", "елка");
echo "Сравнение 'ёлка' и 'елка' в русской локали: " . ($result === 0 ? "равны" : ($result < 0 ? "ёлка меньше" : "ёлка больше")) . "\n";
?>

Если скрипт выполняется без ошибок и выводит данные — значит, всё настроено правильно. Вы должны увидеть что-то вроде:

Версия ICU4C: 72.1
Число 1234567.89 в русском формате: 1 234 567,89
Сравнение 'ёлка' и 'елка' в русской локали: ёлка больше

Профилактика: как избежать ошибки в будущем

Чтобы больше не сталкиваться с dyld: Library not loaded, следуйте этим простым правилам:

  • Регулярно обновляйте PHP через Brew — brew upgrade php перес

Блоги

Рекомендаций по книгам