30秒でできる修正
スプリントの途中で、すぐに pod install を動作させる必要がある場合は、Rosetta 2 翻訳レイヤーを介してコマンドを強制的に実行してください。これにより、Intel環境をエミュレートすることでアーキテクチャの衝突を回避できます。
sudo arch -x86_64 gem install ffi
arch -x86_64 pod install
これは、特定のコマンドを古い Intel マシン上で実行しているかのように扱うよう Mac に指示するものです。通常、これによりシンボルの不一致が即座に解決されます。
なぜこのエラーが発生するのか
このエラーは、Ruby インタプリタと ffi (Foreign Function Interface) gem の間の「ハンドシェイク」の失敗に起因します。具体的なシンボルである _ffi_prep_closure_loc は、libffi ライブラリに属しています。
最近の Mac は ARM64 アーキテクチャを使用していますが、多くの開発ツールはいまだに x86_64 (Intel) バイナリに依存しています。このエラーは、Ruby が ARM64 でネイティブに動作している一方で、CocoaPods が Intel 用にコンパイルされた ffi をロードしようとしたときに発生します。アーキテクチャが一致しないため、ダイナミックリンカ (dyld) は「フラット名前空間」内で必要なシンボルを見つけることができません。これは本質的に、バイナリレベルでの言語の壁です。
恒久的な解決策
方法 1: ネイティブでの再インストール
最もクリーンな方法は、Mac のネイティブ ARM64 チップ向けに ffi gem を再ビルドすることです。これにより、Rosetta を使用する必要が完全になくなります。
- 古い gem を削除する:
sudo gem uninstall ffi
- **ネイティブコンパイラフラグを指定して再インストールする:**
```
sudo gem install ffi -- --with-cflags="-Wno-error=implicit-function-declaration"
ここでは -Wno-error フラグを使用することが重要です。Xcode の新しいバージョンでは、暗黙的な関数宣言をエラーとして扱うため、macOS 14 (Sonoma) や 15 (Sequoia) での ffi のインストールがブロックされることがあります。
- インストールを確認する:
pod install
### 方法 2: Rosetta ブリッジ
プロジェクトに ARM64 では動作しないレガシーな依存関係が含まれている場合があります。その場合は、CocoaPods スタック全体を Rosetta 経由で実行する必要があります。まず、システムに Rosetta 2 がインストールされていることを確認してください。
softwareupdate --install-rosetta
インストール後、次のようにインストールコマンドの先頭に接頭辞を付けます。
sudo arch -x86_64 gem install ffi arch -x86_64 pod install
長いコマンドを入力するのはやめましょう。時間を節約するために `.zshrc` ファイルにエイリアスを追加します。
alias rpod='arch -x86_64 pod install'
### 方法 3: Ruby バージョンマネージャーの使用 (強く推奨)
Apple が提供するデフォルトの「システム」Ruby は、管理が非常に難しいことで知られています。権限エラー (`sudo` が必要) やアーキテクチャの衝突を頻繁に引き起こします。`rbenv` や `asdf` などのツールを使用すると、ユーザーディレクトリ内に専用のネイティブ ARM64 Ruby 環境をインストールできます。
- **Homebrew 経由で rbenv を取得:**
```
brew install rbenv ruby-build
- モダンなネイティブ Ruby (例: 3.3.1) をインストール:
rbenv install 3.3.1 rbenv global 3.3.1
- **シェルをリフレッシュしてツールを再インストール:**
```
gem install cocoapods ffi
pod install
rbenv を介してインストールされた gem は、特定の Ruby バージョンに対してコンパイルされます。このセットアップにより、dlsym シンボルエラーはほぼ確実に解消されます。
結果のテスト
以下の 3 つの簡単なチェックで、環境が正常であることを確認します。
- CPU アーキテクチャ:
ruby -e "puts RbConfig::CONFIG['host_cpu']"を実行します。ネイティブモードの場合はarm64と返されるはずです。 - コマンドの成功:
pod --versionを実行します。クラッシュせずにバージョン番号 (1.15.2 など) が表示されれば問題ありません。 - 最終インストール:
pod installを実行します。緑色の「Pod installation complete」メッセージが表示されることを確認してください。
隠れた落とし穴
ターミナルの設定: Finder を開き、「アプリケーション」>「ユーティリティ」に移動し、ターミナル (または iTerm2) を右クリックします。「情報を見る」を選択します。ネイティブ ARM64 ワークフローを使用する場合は、「Rosetta を使用して開く」がチェックされていないことを確認してください。これにチェックが入っていると、実行するすべてのコマンドが Intel エミュレーションによって遅くなります。
Homebrew のパス: パスを確認してください。ARM64 用の Homebrew は /opt/homebrew にありますが、古い Intel 用は /usr/local にあります。$PATH が /usr/local/bin を先に参照している場合、ネイティブ Mac 上で誤って Intel ベースのツールを使用している可能性があります。

