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をチェックアウトして、リインストールような手順も試したりしたのですが、ハマってしまい大変でしたが、無事に動作したのでよしとします。
あとで自分の対応が思い出せるように、記録に残しました。それでは。