Gem :: Ext :: BuildError:错误:无法构建gem本机扩展Bcrypt-Ruby

我正在制作一个rails应用程序并刚升级到Yosemite,我认为在更新期间一切都破了。 昨晚我把所有代码都签到github时,一切都正常。 我昨晚更新了我的电脑到优胜美地。 今天我跑了gem install bcrypt-ruby ,一切都破了。 我有;

  1. 跑了xcodebuild -license
  2. 更新的捆绑器
  3. 运行brew install rbenv ruby-build rbenv-gem-rehash以获取最新的ruby
  4. 运行brew install coreutils

但这没用。

环境: OSX Yosemite 10.10rbenv 0.4.0ruby 2.1.3p242(2014-09-19修订版47630)[x86_64-darwin14.0],bre​​w 0.9.5

错误的来源是我的rails应用程序:

的Gemfile

 gem 'rails', '4.1.5' gem 'pg' gem 'uglifier', '>= 1.3.0' gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 2.0' gem 'sdoc', '~> 0.4.0', group: :doc gem 'spring', group: :development gem 'bcrypt-ruby' group :test, :development do gem 'rspec-rails', "~> 2.14" end group :test do gem 'capybara', "2.1.0" gem 'factory_girl_rails', '~> 4.2.1' end 

我运行bundle install时遇到错误。 这是完整的堆栈跟踪(所有/users//来自取出名称;)

  Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users//.rbenv/versions/2.0.0-p247/bin/ruby -r ./siteconf20141027-60319-1lss4fm.rb extconf.rb creating Makefile make "DESTDIR=" clean make "DESTDIR=" compiling bcrypt_ext.c couldn't understand kern.osversion `14.0.0' In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:51:21: error: string.h: No such file or directory /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:61:21: error: stdint.h: No such file or directory /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:64:23: error: inttypes.h: No such file or directory /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:68:19: error: stdio.h: No such file or directory In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:70, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/defines.h:29:21: error: stdlib.h: No such file or directory In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:194, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/../lib/gcc/i686-apple-darwin11/4.2.1/include/limits.h:10:25: error: limits.h: No such file or directory In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:1567, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/missing.h:23:45: error: math.h: No such file or directory In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:1568, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:36:23: error: sys/types.h: No such file or directory /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:40:22: error: sys/time.h: No such file or directory In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:43, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:1568, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/st.h:140: error: expected declaration specifiers or '...' before 'uint32_t' In file included from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/ruby.h:1568, from /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby.h:33, from bcrypt_ext.c:1: /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:326: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_fdset_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:416: error: expected declaration specifiers or '...' before 'fd_set' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:416: error: expected declaration specifiers or '...' before 'fd_set' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:416: error: expected declaration specifiers or '...' before 'fd_set' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:416: warning: 'struct timeval' declared inside parameter list /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:416: warning: its scope is only this definition or declaration, which is probably not what you want /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:417: error: expected declaration specifiers or '...' before 'rb_fdset_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:417: error: expected declaration specifiers or '...' before 'rb_fdset_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:417: error: expected declaration specifiers or '...' before 'rb_fdset_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:417: warning: 'struct timeval' declared inside parameter list /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:418: warning: 'struct timeval' declared inside parameter list /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:514: error: expected declaration specifiers or '...' before 'mode_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:593: error: expected declaration specifiers or '...' before 'pid_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:607: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_fork' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:608: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_fork_err' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:610: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_waitpid' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:611: error: expected ')' before 'pid' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:612: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_spawn' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:613: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rb_spawn_err' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:615: error: expected ')' before 'pid' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:728: error: expected declaration specifiers or '...' before 'uint32_t' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:851: error: expected ')' before 'long' /Users//.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/intern.h:852: error: expected ')' before 'long' bcrypt_ext.c: In function 'bc_salt': bcrypt_ext.c:21: warning: incompatible implicit declaration of built-in function 'strlen' make: *** [bcrypt_ext.o] Error 1 make failed, exit code 2 Gem files will remain installed in /Users//ticket_tracker/vendor/bundle/gems/bcrypt-3.1.9 for inspection. Results logged to /Users//ticket_tracker/vendor/bundle/extensions/x86_64-darwin-12/2.0.0-static/bcrypt-3.1.9/gem_make.out An error occurred while installing bcrypt (3.1.9), and Bundler cannot continue. Make sure that `gem install bcrypt -v '3.1.9'` succeeds before bundling. 

如果有人有一些经验更新OSX,Rbenv,Ruby等,并可以给我一些指示,这将非常感激。 如果需要,我还可以发布更多代码/环境设置。

我遇到了同样的问题,我通过重新安装XCode命令行开发人员工具解决了这个问题:

 xcode-select --install bundle install 

只有一系列行动帮助我解决了这个问题。 这是我的序列

1)

 xcode-select --install bundle install 

2)

 brew update brew upgrade rbenv ruby-build 

3)从ruby2.1.4切换到2.1.5

 rbenv install 2.1.5 rbenv global 2.1.5 rbenv shell 2.1.5 rbenv rehash gem install bundler bundle 

4)(可选)如果您遇到安装nokogiri的问题

 brew install libxml2 bundle config build.nokogiri "--use-system-libraries --with-xml2-include=/usr/local/opt/libxml2/include/libxml2" bundle 

在升级到OS X Yosemite并尝试运行一些rails应用程序后,我遇到了一些其他问题;

由于安装Xcode后一些苹果疯狂,gcc不会像其他任何gcc编译器一样编译程序 – 而是要求你阅读并同意许可协议 – 考虑到它是gcc,这是一个血腥的脸颊。 尝试

 gcc --version 

然后页面通过许可证废话并在最后键入同意然后它应该作为一个普通的gcc编译器。

然而,由于gcc(4.2.1)的捆绑版本对于libv8而言太旧(需要4.4),因此仍然可能无法正常工作,因此您需要使用macports安装更高版本的gcc。 访问http://www.macports.org/install.php 。 一旦安装了macports类型

 sudo port install gcc48 +universal sudo port select --set gcc mp-gcc48 hash gcc gcc --version 

你应该看到

 gcc (MacPorts gcc48 4.8.4_0+universal) 4.8.4 

截至2015年3月2日,gcc4.8已经有4个bug修复版本,而gcc4.9已经有2个,所以请你选择。

既然你有一个更新的gcc编译器,那么下一个障碍是建立therubyracer。 darwin上的Gcc4.8无法识别-rdynamic选项,因此不会构建therubyracer。

我已经分叉了therubyracer并修改了extconf.rb来改变编译器选项 – 你可以在github中使用它。 为此,请更改您的Gemfile

 # See https://github.com/sstephenson/execjs#readme for more supported runtimes platforms :ruby do if RUBY_PLATFORM=~ /darwin/ gem 'therubyracer', :git => 'https://github.com/damianham/therubyracer.git' else gem 'therubyracer', '0.12.1' end end 

我正在运行Ruby v 2.2.2,这在我收到此错误时帮助了我:

Gem :: Ext :: BuildError:错误:无法构建gem本机扩展Bcrypt-Ruby

 xcode-select --install brew update gem install bundler bundle install 

如果xcode-select –install失败,请确保您已接受许可

 sudo xcodebuild -license accept 

如果有任何人仍在努力并且不明显,我建议您安装XCode。 我做了两次OSX 10.10升级,他们都需要XCode才能解决这个问题。