ruby-on-rails 如何在M1 Mac上安装和运行ffi

9fkzdhlc  于 2022-11-19  发布在  Ruby
关注(0)|答案(3)|浏览(260)

我使用了'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"
46scxncf

46scxncf1#

您需要使用homebrew安装libffi

brew install libffi

然后,安装应成功,并显示:

gem install ffi

我已经在我的m1上的ruby 2.7.2上测试过了。
同时确保libffi和ruby/gem运行在相同的架构上。您可能混合了一些arm 64和x86二进制文件,这将导致大量的编译器错误。如果您遇到“错误的架构”错误,请尝试在arm/m1上重新安装ruby/homebrew。
供参考:我使用的chruby是通过homebrew安装的,而ruby 2.7.2是通过ruby-install安装的。homebrew和ruby都没有使用rosetta仿真,都是在arm 64上编译的。我已经使用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
mutmk8jj

mutmk8jj2#

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

  • Ruby版本
  • 自制的
  • 尔本夫

并在终端上选择Get Info,然后检查Open using Rosetta
现在重新安装

  • 自制的
  • 尔本夫
  • ruby运行ruby -v检查并验证您的版本具有... [universal.x86_64-darwin21]
f2uvfpb9

f2uvfpb93#

事情是,M1的官方支持是在ffi v 1.14.0中添加的,所以尝试更新到该版本,应该不会破坏任何东西。

gem uninstall ffi

并在Gemfile.lock中手动更改为1.14.0。

gem install ffi -v '1.14.0'

这对我很有效。

相关问题