Ошибка при установке json gem 'mkmf.rb не может найти заголовочные файлы для ruby'


407

Для контекста, это на удаленном сервере, который имеет брандмауэр. Я настраиваю свою среду через прокси. У меня есть ruby 1.8.7. Когда я пытаюсь установить самоцвет ..

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

Так как я не был уверен, в чем проблема, я погуглил и нашел эти

Есть намеки? Спасибо!


проверить наличие /usr/lib/ruby/ruby.hфайла, если он есть, показать нам сообщение об ошибке от gem_make.out.
Малъ Скрылевъ

Ответы:


786

Современное обновление эпохи, как утверждает Миморалеа :

В случае, если вы используете ruby ​​2.0 или 2.2 (спасибо @ patrick-davey).

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-dev

или

sudo apt-get install ruby`ruby -e 'puts RUBY_VERSION[/\d+\.\d+/]'`-dev

Первая ссылка, которую вы разместили, - это как раз ваш случай: не установлена ​​среда разработки ruby. Разработка env необходима для компиляции расширений ruby, которые в основном написаны наC . Прокси не имеет ничего общего с проблемой: все загружается нормально, просто компиляция не удалась.

Я бы посоветовал вам установить ruby-dev( ruby-develдля дистрибутивов на основе rpm) пакет на целевой компьютер.

gcc пакет может быть необходимо.

Пытаться:

$ sudo apt-get install ruby-dev

Или для Redhat дистрибутив:

$ sudo yum install ruby-devel

Или, для [open] SuSE:

$ sudo zypper install ruby-devel

2
Спасибо! Я имел в виду, что ответ в этом вопросе, похоже, зависит от модуля. Думаю вместо ruby-devсвоей ruby-devel. Вот где я нашел то , что именно нужно - digitalocean.com/community/articles/...
Navneet

9
После установки ruby-devel (на Fedora 20) я получил ошибку *** extconf.rb не удалось ***. После установки gcc, как вы предложили, все работало нормально.
Уэйн Риестерер

Вы можете добавить sudo zypper install ruby-develдля openSUSE
супербоб

Это ничего не делает на Ubuntu. Отсутствует пакет ruby2.2-dev(или какая версия установлена ​​у вас).
Луис де Соуза

2
Нет, этот ответ не помог ничего решить. Правильный ответ - ответ от mimoralea .
Луис де Соуза

178

Для Xcode 11 на macOS 10.14 это может произойти даже после установки Xcode и установки инструментов командной строки и принятия лицензии с

sudo xcode-select --install
sudo xcodebuild -license accept

Проблема в том, что Xcode 11 поставляется с MacOS 10.15 SDK, который включает заголовки для ruby2.6, но не для ruby2.3 в macOS 10.14. Вы можете проверить, что это ваша проблема, запустив

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

Однако Xcode 11 устанавливает macOS 10.14 SDK в /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk . Нет необходимости загрязнять системные каталоги, устанавливая старые заголовочные файлы, как указано в других ответах. Вместо этого, выбрав этот SDK, будут найдены соответствующие заголовки ruby2.3:

sudo xcode-select --switch /Library/Developer/CommandLineTools
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должно работать, пока выбран этот SDK.

Чтобы вернуться к текущему Xcode SDK, используйте

sudo xcode-select --switch /Applications/Xcode.app

14
Легенда. Именно моя проблема на 10.14.6. Грустный не может отказать дважды.
Диего Френиш

2
Вы, сэр, неясный повелитель знаний. Большое спасибо,
Рубин Симонс

Спасибо за подробную информацию! Наконец-то это сработало, выдав «ОШИБКУ: Ошибка установки jekyll: jekyll-sass-converter требует версии Ruby> = 2.4.0». Это заставляет меня смеяться.
Николай Ольшевский

@NickolayOlshevsky в этом случае вам нужно установить ruby ​​через homebrew, в настоящее время это версия 2.6.5.
Joki

1
Вы чертовски легенда кодирования.
Алёша Новакович

75

В случае, если вы используете 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

И вы получаете образец здесь ...


6
Или, если вы используете 2.2 ...sudo apt-get install ruby2.2-dev
patrickdavey

@ Patrick- E: Unable to locate package ruby2.2-dev E: Couldn't find any package by regex 'ruby2.2-dev'
Davey

@dson, вероятно, вы используете старую версию Ubuntu. Попробуйте обновить.
Питикос,

Я получил ту же ошибку, и я использую полностью обновленную версию Linux Mint. Я не думаю, что версия ОС является проблемой.
Эндрю Фолкнер

2
Если вы используете старую версию Ubuntu, такую ​​как Trusty (14.04), добавьте PPA brightbox для Ruby:sudo apt-add-repository -y ppa:brightbox/ruby-ng && sudo apt-get update && sudo apt-get install -y ruby2.2-dev
Сиддху


19

Для тех, кто получает это в Mac OS X, вам может потребоваться выполнить следующую команду для установки инструментов командной строки XCode, даже если у вас уже установлен XCode:

sudo xcode-select --install

Также вы должны согласиться с условиями XCode, выполнив следующую команду:

sudo xcodebuild -license

Это был правильный ответ для меня. У меня не было заголовков разработки Ruby. Как только я установил xCode, оригинальная команда, которую я попытался запустить, сработала. Спасибо!
Sweet Chilly Philly

На OSX с Мохаве я должен был выполнить это как:su - $USER -c 'xcode-select --install'
Belden

Это сработало и для меня.
Adougies

11

У меня была похожая проблема с использованием Cygwin для запуска следующей команды:

$ gem install rerun

Я решил это, установив следующие пакеты cygwin:

  • рубиново-разви
  • libffi-разви
  • НКУ-жильный
  • GCC-г ++
  • делать
  • automake1.15

Это для меня ошибка сегментации:/cygdrive/z/.gem/ruby/extensions/x86-cygwin/json-1.8.3/json/ext/parser.so: [BUG] Segmentation fault at 0x0001b8
rr-

Решено, выполнив rm -rf ~/.gem/и переиздав команду.
29-16

ruby-devна малиновом пи
CONvid19

11

Решение с наибольшим количеством голосов не работает на моей машине (Linux Mint 18.04). После тщательного изучения я обнаружил, что g ++ отсутствует. Решено с

sudo apt-get установить g ++


1
Это работало для меня на Ubuntu 18.04. Я также должен был выполнить sudo apt-get install make до установки g ++ для работы.
Скотт Линднер

Может подтвердить установку makeи g++исправить мою проблему на Ubuntu 18.04 тоже!
Арда


5

Xcode 11 / macOS Каталина

В 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

2
Есть ли у вас документация по CPATH? Установка этого не решает проблему для меня. Когда я проверил это значение, оно оказалось неопределенным.
Илиас Карим

1
gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html - вам может понадобиться найти другую переменную окружения в зависимости от языка / компилятора, который вы используете. Это нормально, что по умолчанию он будет отключен
Аарон Брагер,

И, если вы не видели его в другом месте, в пути / имени
XCode

Из всех ответов здесь, это единственное решение, которое сработало для меня. Я на Mojave 10.14.6и XCode 11.3.1. Большое спасибо, мне понадобилось 1 день, чтобы решить эту проблему: /
user2350644

4

В Fedora 21 и выше вы просто открываете терминал и устанавливаете файлы Ruby Development от имени root.

dnf install ruby-devel


1

Xcode -> Настройки -> Местоположения

измените инструменты командной строки на Xcode 11.2.1


1

На Mac 10.14 файлы заголовков, похоже, не установлены в правильном месте. Вместо того, чтобы менять пути, как другие исправления, я смог просто запустить это:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Следуйте инструкциям, и это решило эту проблему для меня.


0

Вам нужно установить весь ruby, а не только минимальный пакет. Правильная команда для использования:

sudo apt install ruby-full

Следующая команда также не установит полный ruby:

sudo apt-get install ruby2.3-dev

0

Для Ubuntu 18, после проверки файла журнала, упомянутого при установке

Результаты заносятся в /var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

с

less /var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

Я заметил, что makeне найден. Так установлено, сделанное

sudo apt-get install make

все работало.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.