M1 Mac に ffi をインストールして実行する方法

概要

私は「ffi」、「~> 1.9」を使用しています。

Rails プロジェクトを実行しようとすると、このエラーが発生します

rake aborted!
LoadError: dlopen(/Users/kanye.west/.rbenv/versions/2.6.9/lib/ruby/gems/2.6.0/gems/ffi-1.9.25/lib/ffi_c.bundle, 0x0009): tried: '/Users/kanye.west/.rbenv/versions/2.6.9/lib/ruby/gems/2.6.0/gems/ffi-1.9.25/lib/ffi_c.bundle' (mach-o file, but is an incompatible architecture (have (x86_64), need (arm64e))) - /Users/kanye.west/.rbenv/versions/2.6.9/lib/ruby/gems/2.6.0/gems/ffi-1.9.25/lib/ffi_c.bundle
/Users/kanye.west/dev/anenta/config/application.rb:14:in `<top (required)>'
/Users/kanye.west/dev/anenta/Rakefile:5:in `require'
/Users/kanye.west/dev/anenta/Rakefile:5:in `<top (required)>'
/Users/kanye.west/.rbenv/versions/2.6.9/bin/bundle:23:in `load'
/Users/kanye.west/.rbenv/versions/2.6.9/bin/bundle:23:in `<main>'

Caused by:
LoadError: cannot load such file -- 2.6/ffi_c
/Users/kanye.west/dev/anenta/config/application.rb:14:in `<top (required)>'
/Users/kanye.west/dev/anenta/Rakefile:5:in `require'
/Users/kanye.west/dev/anenta/Rakefile:5:in `<top (required)>'
/Users/kanye.west/.rbenv/versions/2.6.9/bin/bundle:23:in `load'
/Users/kanye.west/.rbenv/versions/2.6.9/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)

試したアプローチ

gem install --user-install ffi -v '1.9.25' -- --enable-libffi-alloc

gem install ffi -v '1.9.25' -- --with-cflags="-Wno-error=implicit-function-declaration"

gem install ffi -v '1.9.25' --platform=rub

alias gem="arch -x86_64 sudo gem"

CFLAGS="-Wno-error=implicit-function-declaration" RUBY_CONFIGURE_OPTS='--with-readline-dir=/opt/homebrew/opt/readline' gem install ffi -v '1.9.25' -- --with-cflags="-Wno-error=implicit-function-declaration"

解決策

homebrew を使用して libffi をインストールする必要があります。

brew install libffi

その後、インストールは次のように成功するはずです。

gem install ffi

m1 の Ruby 2.7.2 でこれをテストしました。

また、libffi と Ruby/gem の両方が同じアーキテクチャ上で実行されていることを確認してください。 arm64 バイナリと intel バイナリが混在している可能性があり、長期的には多くのコンパイラ エラーが発生します。 「間違ったアーキテクチャ」エラーが発生した場合は、arm/m1 に Ruby/homebrew を再インストールしてみてください。

参考のために: 私はhomebrew経由でインストールされたchrubyを使用し、ruby-install経由でruby 2.7.2をインストールしました。 homebrew と Ruby はどちらも Rosetta エミュレーションを使用しておらず、arm64 でコンパイルされています。 brew install を使用して libffi をインストールし、その後 gem install を使用して ffi を問題なくインストールしました。

pascal@0xc0fefe ~> which ruby
/Users/pascal/.rubies/ruby-2.7.2/bin/ruby

pascal@0xc0fefe ~> which ruby-install
/opt/homebrew/bin/ruby-install

pascal@0xc0fefe ~> file /Users/pascal/.rubies/ruby-2.7.2/bin/ruby
/Users/pascal/.rubies/ruby-2.7.2/bin/ruby: Mach-O 64-bit executable arm64

pascal@0xc0fefe ~> gem install ffi
Building native extensions. This could take a while...
Successfully installed ffi-1.15.5
Parsing documentation for ffi-1.15.5
Done installing documentation for ffi after 0 seconds
1 gem installed