Apple Siliconで発生する LoadError - dlsym symbol not found _ffi_prep_closure_loc の修正

intermediate🍎 macOS2026-04-30| macOS (Apple Silicon M1/M2/M3), CocoaPods, Ruby 3.x, Xcode

Error Message

LoadError - dlsym(0x7f9...): symbol not found in flat namespace '_ffi_prep_closure_loc'
#cocoapods#ios#apple-silicon#ruby#ffi

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 ベースのツールを使用している可能性があります。

Related Error Notes