在 ffi 上进行 bundle 升级失败

27

我试图在我的Rails应用程序上执行bundle update,但是我遇到了以下错误:

Installing ffi (1.0.11) with native extensions Unfortunately, a fatal error has occurred. Please report this error to the Bundler issue tracker at https://github.com/carlhuda/bundler/issues so that we can fix it. Thanks!
/Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:552:in `rescue in block in build_extensions': ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)

        /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/bin/ruby extconf.rb 
checking for ffi.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
    --with-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
    --with-ffi_c-dir
    --without-ffi_c-dir
    --with-ffi_c-include
    --without-ffi_c-include=${ffi_c-dir}/include
    --with-ffi_c-lib
    --without-ffi_c-lib=${ffi_c-dir}/lib
    --with-libffi-config
    --without-libffi-config
    --with-pkg-config
    --without-pkg-config
/Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:381:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:506:in `try_cpp'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:931:in `block in have_header'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:790:in `block in checking_for'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:284:in `block (2 levels) in postpone'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:254:in `open'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:284:in `block in postpone'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:254:in `open'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:280:in `postpone'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:789:in `checking_for'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:930:in `have_header'
    from extconf.rb:9:in `<main>'


Gem files will remain installed in /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/ffi-1.0.11 for inspection.
Results logged to /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/ffi-1.0.11/ext/ffi_c/gem_make.out
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:530:in `block in build_extensions'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:505:in `each'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:505:in `build_extensions'
    from /Users/Kyle/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:180:in `install'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/source.rb:90:in `block in install'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/rubygems_integration.rb:82:in `preserve_paths'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/source.rb:89:in `install'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/installer.rb:73:in `block in install_gem_from_spec'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/rubygems_integration.rb:97:in `with_build_args'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/installer.rb:72:in `install_gem_from_spec'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/installer.rb:56:in `block in run'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/installer.rb:55:in `run'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/installer.rb:12:in `install'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/cli.rb:271:in `update'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/vendor/thor/task.rb:22:in `run'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/vendor/thor/invocation.rb:118:in `invoke_task'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/vendor/thor.rb:263:in `dispatch'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/lib/bundler/vendor/thor/base.rb:386:in `start'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/gems/bundler-1.1.0/bin/bundle:13:in `<top (required)>'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/bin/bundle:19:in `load'
    from /Users/Kyle/.rvm/gems/ruby-1.9.3-p125/bin/bundle:19:in `<main>'

有什么想法吗?

11个回答

35

昨天我遇到了类似的问题。

我通过以下步骤解决了这个问题:

https://github.com/carlhuda/bundler/blob/1-0-stable/ISSUES.md

基本上,我的捆绑有问题,清理并从头开始重建就可以解决问题。

这些步骤在此处重复:

# remove user-specific gems and git repos
rm -rf ~/.bundle/ ~/.gem/

# remove system-wide git repos and git checkouts
rm -rf $GEM_HOME/bundler/ $GEM_HOME/cache/bundler/

# remove project-specific settings and git repos
rm -rf .bundle/

# remove project-specific cached .gem files
rm -rf vendor/cache/

# remove the saved resolve of the Gemfile
rm -rf Gemfile.lock

# try to install one more time
bundle install

虽然,根据输出文本中的信息:

您首先必须安装开发工具。

这让我想到您可能没有安装Apple Xcode开发者工具。你有检查过吗?(我相信它们可以在Mac App Store中获取。)


2
我已经安装了Xcode,但似乎bundler无法找到它的原因...我尝试了你的建议,并安装了https://github.com/kennethreitz/osx-gcc-installer,现在一切都运行正常。感谢你的帮助!我打算给你发放奖金,但是SO让我等待23个小时。那时候我会给你的 :) - Kyle Decot
对我来说,问题在于我已经安装了Xcode,但我还没有同意许可协议。首先以root身份从命令行执行gcc并接受许可协议可以解决问题。之后本地ffi扩展编译就没有问题了。 - Hardy
ffi 在这里有点令人困惑,因为它会显示许多 GCC 抛出的错误。@Kevin 的解决方案实际上解决了我的 ffi 问题,因为它们实际上是由 Bundler 引起的。PS 对我来说,第一个命令实际上是:rm -rf ~/.bundler/ ~/.gem - Matt Jensen
gcc -v -> gcc版本信息 "Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo." -> 同意Xcode/iOS许可证需要管理员权限,请通过sudo以root用户重新运行。 You need to start XCode after update them. -> 您需要在更新后启动XCode。 - a0s
如果您遇到一些与Xcode相关的问题,您必须在打包之前解决它们,以消除错误。 - Joe Half Face

12

对于 Xcode 5 及更高版本:

$ xcode-select --install

安装命令行工具。


11

如果你已经从brew安装了gcc-4.2,那么你需要创建一个符号链接:

ln -s /usr/bin/gcc /usr/bin/gcc-4.2

这就是最终让我安装eventmachine gem的方法。我尝试过更新rvm,重新安装ruby,确保命令行工具在XCode(4.6)中以及其他一些东西。我尝试设置CC=/usr/local/bin/gcc-4.2并且没有设置,但似乎最终编译使用了llvm-gcc,因为现在“/usr/bin/gcc-4.2@ -> /usr/bin/gcc”和“/usr/bin/gcc@ -> llvm-gcc-4.2”。我完全不知道为什么,但它起作用了。希望它不会像brew installs一样搞砸其他东西... - mmrobins
对我来说,我只是更新了我的XCode和命令行工具,然后按照您的建议创建了到/usr/bin/gcc-4.2的符号链接。谢谢!我可能要花一段时间才能想出来这个解决方法。 - David Vezzani
尝试安装XCode命令行工具并运行gem install ffi但没有成功。在@kiero建议下添加符号链接后,ffi-1.9.3成功安装。谢谢! - Lenart
请看下面的答案 - 当你可以轻松用gem install设置CC(C编译器)时,覆盖现有符号链接是不好的。 - lfender6445

7

我遇到的问题是没有安装gcc,Ubuntu下解决方法如下:

sudo apt install build-essential

1
如果您使用的是Alpine系统,请使用apk add alpine-sdk。 - Cyril

5

如果出现问题,尝试运行以下命令:

sudo /usr/bin/gcc

你可能会看到许可协议,请仔细阅读,输入“agree”,然后再次尝试安装gem。


你意识到这个问题有多久了吗?而且它已经有一个被接受的答案了。 - user557846
4
谢谢你的晚回复,实际上这解决了我的问题。 - rubiii
1
这对我有用。谢谢,伙计!以上所有解决方案都没有解决它,但这个解决了。干得好! - Nick Gronow
2
那正是我需要看到的。 (呃,愚蠢的苹果) - Grant Birchmeier

5
请注意:

如果您最近更新了Xcode,您可能只需要打开Xcode并接受最新的协议

我曾经遇到过同样的问题,最近安装了Xcode(v6.1)的更新,并通过以下步骤解决了该问题:

  1. 打开Xcode
  2. 接受新协议
  3. 重新运行bundle update

4
通过 Xcode 安装 "命令行工具" 可以解决问题。
如果您有 Xcode 4.5,请打开“首选项” > “下载” > 选择“组件”选项卡,然后点击“安装”旁边的“命令行工具”。
虽然我是从 Xcode 安装的,但您也可以在不使用 Xcode 的情况下从Apple 开发者下载页面搜索 "命令行工具"下载该软件包。

1

0

另外的方法:

export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
bundle update

ffi.h可以在${SDKROOT}/usr/include/ffi/ffi.h中找到。


0

Mac OS X 10.10.2 Yosemite

 CC=/usr/bin/i686-apple-darwin11-llvm-gcc-4.2 gem install ffi

就是这样 - 检查您是否有可以连接的4.2编译器在/usr/bin

ls /usr/bin|grep gcc|grep 4.2

您不必清除所有本地宝石或覆盖符号链接来完成此操作 - 这是浪费时间的,很可能会带来更多问题。

请注意,如果您需要通过brew安装,则bin路径可能会有所不同。

brew install apple-gcc42 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接