環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

dyld[16017]: Library not loaded: /opt/homebrew/opt/icu4c/lib/libicuio.70.dylibエラーのせいでPHPが動作しない

あるとき、MacでPHP触ろうと思って、composerコマンドを実行しようとした時に気づきました。

正常動作していない

ぬあっ!

エラー内容

$php -v
dyld[16017]: Library not loaded: /opt/homebrew/opt/icu4c/lib/libicuio.70.dylib
  Referenced from: <72C4FBDF-280D-3E34-9D5B-5EFF05155AAD> /Users/xxxxx/.anyenv/envs/phpenv/versions/7.4.30/bin/php
  Reason: tried: '/opt/homebrew/opt/icu4c/lib/libicuio.70.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/opt/icu4c/lib/libicuio.70.dylib' (no such file), '/opt/homebrew/opt/icu4c/lib/libicuio.70.dylib' (no such file), '/usr/local/lib/libicuio.70.dylib' (no such file), '/usr/lib/libicuio.70.dylib' (no such file, not in dyld cache), '/opt/homebrew/Cellar/icu4c/72.1/lib/libicuio.70.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/icu4c/72.1/lib/libicuio.70.dylib' (no such file), '/opt/homebrew/Cellar/icu4c/72.1/lib/libicuio.70.dylib' (no such file), '/usr/local/lib/libicuio.70.dylib' (no such file), '/usr/lib/libicuio.70.dylib' (no such file, not in dyld cache)

結論

なおりました!

なにかのタイミングで、icu4cをバージョン72.1に上げてしまっていたので、70のファイルが無いと怒られていた模様。

バージョン70を入れてあげることで対応しました。

対応

まずは確認

念の為、本当に存在しないのか確認しました。結果、無かったです。

$ ls -la /opt/homebrew/opt/icu4c/lib
drwxr-xr-x  28 xxxxx  admin       896  2 22 18:18 .
drwxr-xr-x  12 xxxxx  admin       384  2 22 18:18 ..
drwxr-xr-x   6 xxxxx  admin       192 10 19 09:53 icu
-r--r--r--   1 xxxxx  admin  31523280  2 22 18:18 libicudata.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.72.dylib -> libicudata.72.1.dylib
-r--r--r--   1 xxxxx  admin  31252736 10 19 09:53 libicudata.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.dylib -> libicudata.72.1.dylib
-rw-r--r--   1 xxxxx  admin   2801200  2 22 18:18 libicui18n.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.72.dylib -> libicui18n.72.1.dylib
-r--r--r--   1 xxxxx  admin   4879904 10 19 09:53 libicui18n.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.dylib -> libicui18n.72.1.dylib
-rw-r--r--   1 xxxxx  admin    100160  2 22 18:18 libicuio.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.72.dylib -> libicuio.72.1.dylib
-r--r--r--   1 xxxxx  admin     63432 10 19 09:53 libicuio.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.dylib -> libicuio.72.1.dylib
-rw-r--r--   1 xxxxx  admin    122528  2 22 18:18 libicutest.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.72.dylib -> libicutest.72.1.dylib
-r--r--r--   1 xxxxx  admin     84016 10 19 09:53 libicutest.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.dylib -> libicutest.72.1.dylib
-rw-r--r--   1 xxxxx  admin    237216  2 22 18:18 libicutu.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.72.dylib -> libicutu.72.1.dylib
-r--r--r--   1 xxxxx  admin    266144 10 19 09:53 libicutu.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.dylib -> libicutu.72.1.dylib
-r--r--r--   1 xxxxx  admin   1748752  2 22 18:18 libicuuc.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.72.dylib -> libicuuc.72.1.dylib
-r--r--r--   1 xxxxx  admin   2685024 10 19 09:53 libicuuc.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.dylib -> libicuuc.72.1.dylib
drwxr-xr-x   5 xxxxx  admin       160  2 22 18:18 pkgconfig

icu4cのバージョン70を入れる

コマンドの”supi”の箇所は何の文字列でも可能。筆者は自分の名前を使ってます。

$ brew tap-new supi/taps # "supi"の箇所は何の文字列でも可能。筆者は自分の名前を使ってます。
Initialized empty Git repository in /opt/homebrew/Library/Taps/supi/homebrew-taps/.git/
[main (root-commit) d57afbb] Create supi/taps tap
 Committer: xxxxx
 3 files changed, 90 insertions(+)
 create mode 100644 .github/workflows/publish.yml
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 README.md
==> Created supi/taps
/opt/homebrew/Library/Taps/supi/homebrew-taps

When a pull request making changes to a formula (or formulae) becomes green
(all checks passed), then you can publish the built bottles.
To do so, label your PR as `pr-pull` and the workflow will be triggered.
$ brew extract icu4c supi/taps --version 70
==> Searching repository history
==> Writing formula for icu4c from revision fe6a2fe to:
/opt/homebrew/Library/Taps/supi/homebrew-taps/Formula/icu4c@70.rb
$ brew install supi/taps/icu4c@70
==> Fetching supi/taps/icu4c@70
==> Downloading https://github.com/unicode-org/icu/releases/download/release-70-1/icu4c-70_1-src.tgz
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/49244766/2b364418-d38d-4d23-b918-11d1194d4cb6?X-Amz-Algorithm=AWS4
######################################################################## 100.0%
==> Installing icu4c@70 from supi/taps
==> ./configure --prefix=/opt/homebrew/Cellar/icu4c@70/70.1 --disable-samples --disable-tests --enable-static --with-library-bits=64
==> make
==> make install
==> Caveats
icu4c@70 is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides libicucore.dylib (but nothing else).

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

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

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

==> Summary
🍺  /opt/homebrew/Cellar/icu4c@70/70.1: 261 files, 74.9MB, built in 1 minute
==> Running `brew cleanup icu4c@70`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Downloading https://formulae.brew.sh/api/formula.json
##O=#  #        

インストール確認

確認してみました。しっかりicu4c@70がインストールされていました。やった!

$ ls -la /opt/homebrew/opt/icu4c*
lrwxr-xr-x  1 xxxxx  admin  20  2 22 18:18 /opt/homebrew/opt/icu4c -> ../Cellar/icu4c/72.1
lrwxr-xr-x  1 xxxxx  admin  23  2 22 18:26 /opt/homebrew/opt/icu4c@70 -> ../Cellar/icu4c@70/70.1

シムリンクをはる

格好良い対応かは分かりませんが、とりあえずシムリンクをはって動作を確認してみることにします。

はるシムリンクについて再度確認。

$ ls -la /opt/homebrew/opt/icu4c/lib
total 148016
drwxr-xr-x  28 xxxxx  admin       896  2 22 18:18 .
drwxr-xr-x  12 xxxxx  admin       384  2 22 18:18 ..
drwxr-xr-x   6 xxxxx  admin       192 10 19 09:53 icu
-r--r--r--   1 xxxxx  admin  31523280  2 22 18:18 libicudata.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.72.dylib -> libicudata.72.1.dylib
-r--r--r--   1 xxxxx  admin  31252736 10 19 09:53 libicudata.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.dylib -> libicudata.72.1.dylib
-rw-r--r--   1 xxxxx  admin   2801200  2 22 18:18 libicui18n.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.72.dylib -> libicui18n.72.1.dylib
-r--r--r--   1 xxxxx  admin   4879904 10 19 09:53 libicui18n.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.dylib -> libicui18n.72.1.dylib
-rw-r--r--   1 xxxxx  admin    100160  2 22 18:18 libicuio.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.72.dylib -> libicuio.72.1.dylib
-r--r--r--   1 xxxxx  admin     63432 10 19 09:53 libicuio.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.dylib -> libicuio.72.1.dylib
-rw-r--r--   1 xxxxx  admin    122528  2 22 18:18 libicutest.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.72.dylib -> libicutest.72.1.dylib
-r--r--r--   1 xxxxx  admin     84016 10 19 09:53 libicutest.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.dylib -> libicutest.72.1.dylib
-rw-r--r--   1 xxxxx  admin    237216  2 22 18:18 libicutu.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.72.dylib -> libicutu.72.1.dylib
-r--r--r--   1 xxxxx  admin    266144 10 19 09:53 libicutu.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.dylib -> libicutu.72.1.dylib
-r--r--r--   1 xxxxx  admin   1748752  2 22 18:18 libicuuc.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.72.dylib -> libicuuc.72.1.dylib
-r--r--r--   1 xxxxx  admin   2685024 10 19 09:53 libicuuc.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.dylib -> libicuuc.72.1.dylib
drwxr-xr-x   5 xxxxx  admin       160  2 22 18:18 pkgconfig

$ ls -la /opt/homebrew/opt/icu4c@70/lib 
total 140848
drwxr-xr-x  28 xxxxx  admin       896  2 22 18:26 .
drwxr-xr-x  12 xxxxx  admin       384  2 22 18:26 ..
drwxr-xr-x   6 xxxxx  admin       192  2 22 18:26 icu
-r--r--r--   1 xxxxx  admin  29723472  2 22 18:26 libicudata.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicudata.70.dylib -> libicudata.70.1.dylib
-r--r--r--   1 xxxxx  admin  29466768  2 22 18:26 libicudata.a
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicudata.dylib -> libicudata.70.1.dylib
-r--r--r--   1 xxxxx  admin   2779744  2 22 18:26 libicui18n.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicui18n.70.dylib -> libicui18n.70.1.dylib
-r--r--r--   1 xxxxx  admin   4843312  2 22 18:26 libicui18n.a
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicui18n.dylib -> libicui18n.70.1.dylib
-r--r--r--   1 xxxxx  admin    100160  2 22 18:26 libicuio.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicuio.70.dylib -> libicuio.70.1.dylib
-r--r--r--   1 xxxxx  admin     63456  2 22 18:26 libicuio.a
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicuio.dylib -> libicuio.70.1.dylib
-r--r--r--   1 xxxxx  admin    122560  2 22 18:26 libicutest.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicutest.70.dylib -> libicutest.70.1.dylib
-r--r--r--   1 xxxxx  admin     84136  2 22 18:26 libicutest.a
lrwxr-xr-x   1 xxxxx  admin        21  2 22 18:26 libicutest.dylib -> libicutest.70.1.dylib
-r--r--r--   1 xxxxx  admin    237216  2 22 18:26 libicutu.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicutu.70.dylib -> libicutu.70.1.dylib
-r--r--r--   1 xxxxx  admin    265672  2 22 18:26 libicutu.a
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicutu.dylib -> libicutu.70.1.dylib
-r--r--r--   1 xxxxx  admin   1748624  2 22 18:26 libicuuc.70.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicuuc.70.dylib -> libicuuc.70.1.dylib
-r--r--r--   1 xxxxx  admin   2662016  2 22 18:26 libicuuc.a
lrwxr-xr-x   1 xxxxx  admin        19  2 22 18:26 libicuuc.dylib -> libicuuc.70.1.dylib
drwxr-xr-x   5 xxxxx  admin       160  2 22 18:26 pkgconfig

上記を見ると、lib配下には、12個ほどシムリンクがありますが、「libicuio.dylib -> libicuio.72.1.dylib」(バージョンなし)と「libicuio.72.dylib -> libicuio.72.1.dylib」(メジャーバージョンからの遷移)の2種類がある。

エラーでは「/opt/homebrew/opt/icu4c/lib/libicuio.70.dylib」を探しに行っていたので、一旦バージョンなしは72.1を見続けてもらって、バージョン70用のシムリンクを作成して、icu4c@70側に向けてあげることにします。

$ cd /opt/homebrew/opt/icu4c/lib
$ ln -s ../../../icu4c@70/70.1/lib/libicudata.70.dylib libicudata.70.dylib
$ ln -s ../../../icu4c@70/70.1/lib/libicui18n.70.dylib libicui18n.70.dylib
$ ln -s ../../../icu4c@70/70.1/lib/libicuio.70.dylib libicuio.70.dylib
$ ln -s ../../../icu4c@70/70.1/lib/libicutest.70.dylib libicutest.70.dylib
$ ln -s ../../../icu4c@70/70.1/lib/libicutu.70.dylib libicutu.70.dylib
$ ln -s ../../../icu4c@70/70.1/lib/libicuuc.70.dylib libicuuc.70.dylib
$ ls -la /opt/homebrew/opt/icu4c/lib
total 148016
drwxr-xr-x  34 xxxxx  admin      1088  2 22 18:36 .
drwxr-xr-x  12 xxxxx  admin       384  2 22 18:18 ..
drwxr-xr-x   6 xxxxx  admin       192 10 19 09:53 icu
lrwxr-xr-x   1 xxxxx  admin        46  2 22 18:36 libicudata.70.dylib -> ../../../icu4c@70/70.1/lib/libicudata.70.dylib
-r--r--r--   1 xxxxx  admin  31523280  2 22 18:18 libicudata.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.72.dylib -> libicudata.72.1.dylib
-r--r--r--   1 xxxxx  admin  31252736 10 19 09:53 libicudata.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicudata.dylib -> libicudata.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        46  2 22 18:36 libicui18n.70.dylib -> ../../../icu4c@70/70.1/lib/libicui18n.70.dylib
-rw-r--r--   1 xxxxx  admin   2801200  2 22 18:18 libicui18n.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.72.dylib -> libicui18n.72.1.dylib
-r--r--r--   1 xxxxx  admin   4879904 10 19 09:53 libicui18n.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicui18n.dylib -> libicui18n.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        44  2 22 18:36 libicuio.70.dylib -> ../../../icu4c@70/70.1/lib/libicuio.70.dylib
-rw-r--r--   1 xxxxx  admin    100160  2 22 18:18 libicuio.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.72.dylib -> libicuio.72.1.dylib
-r--r--r--   1 xxxxx  admin     63432 10 19 09:53 libicuio.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuio.dylib -> libicuio.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        46  2 22 18:36 libicutest.70.dylib -> ../../../icu4c@70/70.1/lib/libicutest.70.dylib
-rw-r--r--   1 xxxxx  admin    122528  2 22 18:18 libicutest.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.72.dylib -> libicutest.72.1.dylib
-r--r--r--   1 xxxxx  admin     84016 10 19 09:53 libicutest.a
lrwxr-xr-x   1 xxxxx  admin        21 10 19 09:53 libicutest.dylib -> libicutest.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        44  2 22 18:36 libicutu.70.dylib -> ../../../icu4c@70/70.1/lib/libicutu.70.dylib
-rw-r--r--   1 xxxxx  admin    237216  2 22 18:18 libicutu.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.72.dylib -> libicutu.72.1.dylib
-r--r--r--   1 xxxxx  admin    266144 10 19 09:53 libicutu.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicutu.dylib -> libicutu.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        44  2 22 18:36 libicuuc.70.dylib -> ../../../icu4c@70/70.1/lib/libicuuc.70.dylib
-r--r--r--   1 xxxxx  admin   1748752  2 22 18:18 libicuuc.72.1.dylib
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.72.dylib -> libicuuc.72.1.dylib
-r--r--r--   1 xxxxx  admin   2685024 10 19 09:53 libicuuc.a
lrwxr-xr-x   1 xxxxx  admin        19 10 19 09:53 libicuuc.dylib -> libicuuc.72.1.dylib
drwxr-xr-x   5 xxxxx  admin       160  2 22 18:18 pkgconfig

確認

動きました!

$ php -v
PHP 8.1.14 (cli) (built: Jan  9 2023 18:56:56) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.14, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.14, Copyright (c), by Zend Technologies
    with Xdebug v3.2.0, Copyright (c) 2002-2022, by Derick Rethans

composerでlaravelのプロジェクト作成なんかもを試してみましたが、無事に動作しました。

まとめ

実は、gitで旧バージョンのicu4cをチェックアウトして、リインストールような手順も試したりしたのですが、ハマってしまい大変でしたが、無事に動作したのでよしとします。

あとで自分の対応が思い出せるように、記録に残しました。それでは。