phpがdyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.68.dylibエラーで動かなくなった

こんにちは。Gaji-Labo 横田です。ある日突然、anyenv でいれている php が icu4c でエラーで動かなくなって困りました。その時の解決方法です。

エラー

php のバージョンは 8.0.11。

% anyenv versions                                                         
phpenv:
  system
* 8.0.11 (set by /Users/[*]/.php-version)

composer install をたたくとエラーに。

% composer install                                                         
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.68.dylib
  Referenced from: /Users/[USER NAME]/.anyenv/envs/phpenv/versions/8.0.11/bin/php
  Reason: image not found
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.68.dylib
  Referenced from: /Users/[USER NAME]/.anyenv/envs/phpenv/versions/8.0.11/bin/php
  Reason: image not found
/Users/[USER NAME]/.anyenv/envs/phpenv/plugins/phpenv-composer/libexec/composer: line 43: 87773 Abort trap: 6           "$php_bin" "$composer_phar" "$@"

そもそも php -v が通らなくなってる。

% php -v                                                                   
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.68.dylib
  Referenced from: /Users/[USER NAME]/.anyenv/envs/phpenv/versions/8.0.11/bin/php
  Reason: image not found
zsh: abort      php -v

何が起きてるのか

エラーとなっている icu4c をHomebrew で見てみると

% brew info icu4c                                                                                                                    [master]
icu4c: stable 70.1 (bottled) [keg-only]
C/C++ and Java libraries for Unicode and globalization
https://icu.unicode.org/home
/usr/local/Cellar/icu4c/67.1 (258 files, 71.2MB)
  Poured from bottle on 2020-08-28 at 14:08:31
/usr/local/Cellar/icu4c/68.2 (259 files, 72.5MB)
  Poured from bottle on 2022-01-14 at 15:44:39
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/icu4c.rb
License: ICU

どうやら、依存しているパッケージ icu4c のバージョンが 70.1 と新しくなってしまっているのが原因のようです。brew update などが原因となることが多いようです。
エラーを見直してみると

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.68.dylib

とあるので、バージョン68系に戻すとよさそうです。

icu4c をインストールし直す

まずは brew update し、 icu4c をインストールし直します。

% brew update && brew reinstall icu4c
.
.
.
==> icu4c
icu4c is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have icu4c first in your PATH, run:
  echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.zshrc
  echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.zshrc

For compilers to find icu4c you may need to set:
  export LDFLAGS="-L/usr/local/opt/icu4c/lib"
  export CPPFLAGS="-I/usr/local/opt/icu4c/include"

For pkg-config to find icu4c you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"

Homebrew の Formulaディレクトリに移動する

% cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

icu4c のコミットログを確認する

% git log --follow icu4c.rb

commit fdba13da61f815f5ab0789f4af72b8f9d05543a6
Author: Carlo Cabrera <30379873+carlocab@users.noreply.github.com>
Date:   Sat Feb 27 23:48:29 2021 +0000

    icu4c: update 68.2 bottle.

commit 45dd7258f9aecaf2606a47f3d5518b452889533a
Author: Carlo Cabrera <30379873+carlocab@users.noreply.github.com>
Date:   Tue Feb 16 13:32:01 2021 +0000

    icu4c 68.2

    Removed patch.

目的のバージョン 68 系がありました。

目的のバージョンをインストール

ダウングレードしたいバージョン 68 系にチェックアウトし、パッケージをインストールします。インストール後は目的のバージョンにスイッチ。

% git checkout fdba13da61f815f5ab0789f4af72b8f9d05543a6
% brew reinstall ./icu4c.rb
% brew switch icu4c 68.2

ダウングレードを確認

% brew info icu4c                                                           
icu4c: stable 68.2 (bottled) [keg-only]
C/C++ and Java libraries for Unicode and globalization
http://site.icu-project.org/home
/usr/local/Cellar/icu4c/68.2 (259 files, 72.5MB)
  Poured from bottle on 2022-06-24 at 12:11:05
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/icu4c.rb
License: ICU

68 系にダウングレード出来てるのが確認できました!

Formula で master へ checkout する

Formula % git checkout master
Updating files: 100% (6390/6390), done.
Previous HEAD position was fdba13da61f icu4c: update 68.2 bottle.
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

これで無事に php が動くようになりました!

% php -v
PHP 8.0.11 (cli) (built: Jan 17 2022 16:01:29) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.11, Copyright (c) Zend Technologies
  with Zend OPcache v8.0.11, Copyright (c), by Zend Technologies
  with Xdebug v3.1.2, Copyright (c) 2002-2021, by Derick Rethans

終わりに

突然動かなくなった時でもエラーメッセージをよく読み解けば解決へのヒントがありますね。
動かなくなった時にいつも一緒に調べてくれたりヒントをくれるメンバーに感謝を持って、今日はこの辺で。

この機会に、オンラインで気軽に面談してみませんか?

現在弊社では一緒にお仕事をしてくださるエンジニアさんやデザイナーさんを積極募集しています。まずはカジュアルな面談で、お互いに大事にしていることをお話できたらうれしいです。詳しい応募要項は以下からチェックしてください。

パートナー契約へのお問い合わせもお仕事へのお問い合わせも、どちらもいつでも大歓迎です。まずはオンラインでのリモート面談からはじめましょう。ぜひお気軽にお問い合わせください!

お問い合わせしてみる!


投稿者 Yokota Tomoko

運用やアクセシビリティに配慮したHTML/CSSの設計やコンポーネント作成、スタイルガイドの構築、コードレビュー、組み込み、要件の整理、社内進行管理、顧客とのコミュニケーションまで、ジョインしたチームを前に進めるためにあれこれ担当しています。子育てと仕事のバランスを楽しめるよう、日々模索しています。