Gem:: Ext:: BuildError: ERROR: Не удалось создать собственное расширение Gem Bcrypt-Ruby

Я делаю приложение для рельсов и просто обновлен до Yosemite, и я думаю, что во время этого обновления все сломалось. Все вчера работало, когда я проверял весь код на github. Вчера вечером я обновил свой компьютер до Йосемити. Сегодня я побежал gem install bcrypt-ruby, и все сломалось. Я:

  • ran xcodebuild -license
  • обновленный комплект
  • ran brew install rbenv ruby-build rbenv-gem-rehash, чтобы получить последний ruby ​​
  • ran brew install coreutils
Тем не менее, это не сработало.

: OSX Yosemite 10.10, rbenv 0.4.0, ruby ​​2.1.3p242 (версия 2014-09-19 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 и т.д. и может дать мне несколько указателей, это было бы высоко оценено. Я также могу разместить больше кода/среды, если это необходимо.

Ответ 1

У меня была та же проблема, которую я решил, повторно установив инструменты разработки командной строки XCode:

xcode-select --install
bundle install

Ответ 2

Только одна комбинация действий помогла мне решить проблему. Вот моя последовательность

1)

xcode-select --install
bundle install

2)

brew update
brew upgrade rbenv ruby-build

3) Переключение с рубина 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

Ответ 3

После обновления до OS X Yosemite и попыток запуска некоторых приложений с рельсами я столкнулся с некоторыми другими проблемами;

Из-за некоторого безумия Apple после установки Xcode gcc не компилирует такие программы, как любой другой gcc-компилятор, вместо этого он просит вас прочитать и согласиться с лицензионным соглашением - это кровавая щека, учитывая, что это gcc. Попробуйте

gcc --version 

затем пройдите через лицензионный дерьмо, и тип соглашается в конце, тогда он должен действовать как обычный gcc-компилятор.

Однако это все еще может не сработать, поскольку связанная версия gcc (4.2.1) слишком устарела для libv8 (требуется 4.4), поэтому вам нужно установить более позднюю версию gcc с использованием macports. Посетите 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

по состоянию на 3/2/2015 gcc4.8 имеет 4 исправления ошибок, и gcc4.9 имеет 2, так что сделайте выбор.

Теперь, когда у вас есть более современный gcc-компилятор, следующее препятствие создает сборщик. Gcc4.8 на darwin не распознает -динамическую опцию, поэтому therubyracer не будет строить.

У меня есть forked 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

Ответ 4

Я запускаю Ruby v 2.2.2, это помогло мне, когда я получил эту ОШИБКУ:

Gem:: Ext:: BuildError: ERROR: Не удалось создать собственное расширение gem Bcrypt-Ruby

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

Если xcode-select -install не работает, убедитесь, что вы приняли лицензию

sudo xcodebuild -license accept

Ответ 5

Если есть кто-то еще, он все еще борется, и это не очевидно, я бы порекомендовал вам установить XCode. Я сделал два обновления OSX 10.10, и они оба потребовали XCode для решения этой проблемы.