如何在M1 Mac上安装和运行ffi

问题描述 投票:0回答:4

我正在使用“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"

ruby-on-rails ruby apple-m1 ffi
4个回答
14
投票

您需要使用自制程序安装

libffi

brew install libffi

然后安装应该成功:

gem install ffi

我已经在我的 m1 上的 ruby 2.7.2 上测试了这个。

还要确保 libffi 和 ruby/gem 运行在同一架构上。您可能混合了一些 arm64 和 intel 二进制文件,从长远来看,这会导致大量编译器错误。如果遇到“错误架构”错误,请尝试在arm/m1上重新安装ruby/homebrew。

供参考: 我正在使用通过 homebrew 安装的 chruby,并通过

2.7.2
安装 ruby
ruby-install
。 Homebrew 和 ruby 都不使用 Rosetta 仿真,而是在 arm64 上编译。我已经使用
libffi
安装了
brew install
,然后使用
ffi
安装了
gem install
,没有任何问题。

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

5
投票

问题是,ffi v 1.14.0中添加了对 M1 的官方支持,因此请尝试更新到该版本,应该不会破坏任何内容。

gem uninstall ffi

并在

Gemfile.lock
中手动更改为 1.14.0。

gem install ffi -v '1.14.0'

这对我有用。


1
投票

我一直在尝试安装一个演示 React Native 应用程序,它天真地要求运行

pod install
,然后就陷入了这个
ffi
兔子洞。

在我的 M2 / Monterey 上,这篇文章效果很好,除了缺少安装

asdf

的 ruby 插件的说明

asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git


0
投票

这是我发现有效的唯一解决方法,下载 Rosette,https://support.apple.com/en-us/HT211861,然后卸载(您需要执行此操作,以便处理与当前架构不兼容的任何内容):

  • 红宝石版本
  • 自制
  • rbenv

并在终端上选择

Get Info
,然后检查
Open using Rosetta

现在重新安装

  • 自制
  • rbenv
  • 红宝石 奔跑吧
    ruby -v
    检查并验证您的版本是否有
    ... [universal.x86_64-darwin21]
© www.soinside.com 2019 - 2024. All rights reserved.