Gem::Ext::BuildError: ERROR: 无法构建本地扩展宝石 Bcrypt-Ruby

13

我正在制作一个Rails应用程序,刚刚升级到了Yosemite,我认为一切都在那次更新中出了问题。昨晚我检查了所有代码并将其上传到GitHub时,一切正常。昨晚我将电脑更新到了Yosemite。今天我运行了gem install bcrypt-ruby,然后一切都崩溃了。我已经:

  1. 运行了xcodebuild -license
  2. 更新了bundler
  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 revision 47630) [x86_64-darwin14.0],brew 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等方面有一些经验,并且可以给我一些指导,那将不胜感激。如果需要,我也可以发布更多的代码/环境设置。
5个回答

21

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

xcode-select --install
bundle install

由于某种原因,我认为我已经通过 xcode -license 解决了这个问题。感谢您澄清了这一点。 - user3749994
1
似乎每次安装或更新Xcode都需要重新安装命令行工具。 - Tom Harrison
稍微有些不同的看法,我遇到了相同的错误,尝试了xcodebuild -license,但出现了一个需要使用sudo的错误,所以我使用了'sudo xcodebuild -license',然后它就可以工作了。我仍然在使用Mavericks,但已经下载了Yosemite进行安装,所以不确定这是否会影响事情。 - gorlaz
弹出一个窗口,上面写着“无法安装软件,因为当前无法从软件更新服务器获取。”。你知道这是暂时的吗? - A F
我正在使用Ubuntu 14.04,同样的问题也出现在我的电脑上。请帮忙解决。 - Jai Chauhan

1
只有一系列行动帮助我解决了这个问题。以下是我的步骤:
1)
xcode-select --install
bundle install

2)
brew update
brew upgrade rbenv ruby-build

3) 从Ruby 2.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

0

在升级到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个错误修复版本,而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

请不要同时安装Homebrew和MacPorts。这样会导致一些奇怪的冲突,解决起来会是一场噩梦。 - ShadSterling

0

我正在运行 Ruby v 2.2.2 版本,当我收到以下错误时,这个版本对我有所帮助:

Gem::Ext::BuildError: ERROR: Failed to build gem native extension Bcrypt-Ruby

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

如果 xcode-select --install 失败,请确保您已接受许可协议。
sudo xcodebuild -license accept

-1
如果还有人在苦苦挣扎并且不是很明显的话,我建议您安装 XCode。我已经升级了两个 OS X 10.10 版本,它们都需要 XCode 来解决这个问题。

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