Ошибка при установке json gem 'mkmf.rb не может найти заголовочные файлы для ruby'
В контексте, на удаленном сервере с брандмауэром. Я настраиваю свою среду через прокси. У меня ruby 1.8.7
. Когда я пытаюсь установить gem..
sudo gem install --http-proxy <host address>:<port> json
Я получаю следующую ошибку:
Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h
Gem files will remain installed in /usr/lib64/ruby/gems/1.8/gems/json-1.8.1 for inspection.
Results logged to /usr/lib64/ruby/gems/1.8/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
Поскольку я не знал, в чем проблема, я googled и нашел эти
Любые подсказки? Спасибо!
Ответы
Ответ 1
Современное обновление эпохи, как утверждает Mimoralea:
В случае, если вы используете ruby 2.0 или 2.2 (спасибо @patrick-davey).
sudo apt-get install ruby-dev
sudo apt-get install ruby2.0-dev
sudo apt-get install ruby2.2-dev
sudo apt-get install ruby2.3-dev
или, в общем случае:
sudo apt-get install ruby'ruby -e 'puts RUBY_VERSION[/\d+\.\d+/]''-dev
Первая ссылка, которую вы опубликовали, относится именно к вашему делу: не установлена среда разработки ruby. Разработка env необходима для компиляции расширений ruby, которые в основном написаны на C
Прокси не имеет ничего общего с проблемой: все загружается нормально, просто компиляция не удалась.
Я бы посоветовал вам установить пакет ruby-dev
(ruby-devel
для дистрибутивов на основе rpm) на целевой машине. gcc
может понадобиться пакет gcc
.
Пытаться:
$ sudo apt-get install ruby-dev
Или для Redhat дистрибутив:
$ sudo yum install ruby-devel
Или для [open] SuSE:
$ sudo zypper install ruby-devel
Ответ 2
Если вы используете ruby 2.0 или 2.2 (спасибо @patrick-davey) или 2.3 (спасибо @juanitofatas).
sudo apt-get install ruby-dev
sudo apt-get install ruby2.0-dev
sudo apt-get install ruby2.2-dev
sudo apt-get install ruby2.3-dev
И вы получите шаблон здесь...
Ответ 3
Я также столкнулся с этой проблемой, потому что я установил Ruby на Ubuntu через ярлык, и я подумал, что ruby-dev - это багажник рубина. Поэтому я не установил. Установка ruby2.3-dev исправляет это:
sudo apt-get install ruby2.3-dev
Ответ 4
Для тех, кто получает это в Mac OS X, вам может потребоваться выполнить следующую команду для установки инструментов командной строки XCode, даже если у вас уже установлен XCode:
sudo xcode-select --install
Также вы должны согласиться с условиями XCode, выполнив следующую команду:
sudo xcodebuild -license
Ответ 5
У меня была аналогичная проблема с использованием cygwin для запуска следующей команды:
$ gem install rerun
Я решил это, установив следующие пакеты cygwin:
- рубинового разви
- libffi-разви
- НКА-ядро
- GCC-г ++
- сделать
- automake1.15
Ответ 6
Решение с наибольшим количеством голосов не работает на моей машине (Linux Mint 18.04). После тщательного изучения я обнаружил, что g++ отсутствует. Решено с
sudo apt-get install g++
Ответ 7
если вы используете SUSE
sudo yast2 -i ruby-devel
Ответ 8
Для XCode 11 в MacOS 10.14 это может произойти даже после установки XCode, установки инструментов командной строки и принятия лицензии с помощью
xcode-select --install
xcodebuild -license accept
Проблема в том, что Xcode поставляет macOS 10.15 SDK, который включает заголовки для ruby2.6, но не для macOS 10.14 ruby2.3. Вы можете убедиться, что это ваша проблема, запустив
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
который в macOS 10.14 с Xcode 11 печатает несуществующий путь
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0
В /Library/Developer/CommandLineTools/SDKs
все еще может быть macOS 10.14 SDK. Нет необходимости загрязнять системные каталоги, устанавливая старые заголовочные файлы, как указано в других ответах. Вместо этого, указав на нее переменную окружения SDKROOT
, будут найдены соответствующие заголовки ruby2.3:
SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/
export SDKROOT
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
Теперь это должно правильно напечатать
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk//System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0
Аналогично, gem install
должен работать, пока установлена переменная окружения SDKROOT
.
Ответ 9
В Fedora 21 и выше вы просто открываете терминал и устанавливаете файлы разработки Ruby как root.
dnf install ruby-devel
Ответ 10
Возможно, вам понадобится установить gcc после установки ruby-devel
Ответ 11
Xcode 11/macOS Catalina
В Xcode 11/macOS Catalina файлы заголовков больше не находятся в старом расположении, а старый файл /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
больше не доступен.
Вместо этого заголовки теперь устанавливаются в каталог /usr/include
текущего пути SDK:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
Большую часть этого каталога можно найти с помощью вывода xcrun --show-sdk-path
. И если вы добавите этот путь в переменную окружения CPATH
, то сценарии сборки (включая те, которые вызываются через bundle
), как правило, смогут найти его.
Я решил эту проблему, установив CPATH
в моем файле .zshrc
:
export CPATH="$(xcrun --show-sdk-path)/usr/include"
После открытия новой оболочки (или запуска source .zshrc
) я больше не получаю сообщение об ошибке mkmf.rb не может найти заголовочные файлы для ruby по адресу /usr/lib/ruby/ruby.h, и rubygems установлены правильно.
Замечание о сборке на платформах, отличных от macOS
Если вы выполняете сборку на не-macOS платформах, таких как iOS/tvOS/watchOS, это изменение попытается включить macOS SDK в эти платформы, что приведет к ошибкам сборки. Чтобы решить эту проблему, либо не устанавливайте переменную среды CPATH
при входе в систему, либо временно устанавливайте ее как пустую при запуске xcodebuild
следующим образом:
CPATH="" xcodebuild --some-args
Ответ 12
Вам нужно установить весь ruby, а не только минимальный пакет. Правильная команда для использования:
sudo apt install ruby-full
Следующая команда также не установит полный ruby:
sudo apt-get install ruby2.3-dev