Błąd podczas instalacji jsona „mkmf.rb nie może znaleźć plików nagłówkowych dla ruby”

407

Dla kontekstu na zdalnym serwerze, który ma zaporę ogniową. Konfiguruję środowisko za pośrednictwem serwera proxy. Mam ruby 1.8.7. Kiedy próbuję zainstalować klejnot ...

sudo gem install --http-proxy <host address>:<port> json

Otrzymuję następujący błąd:

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

Ponieważ nie byłem pewien, na czym polega problem, poszukałem go i znalazłem

Jakieś wskazówki? Dzięki!

Navneet
źródło
sprawdź obecność /usr/lib/ruby/ruby.hpliku, jeśli jest obecny, pokaż nam komunikat o błędzie z gem_make.out.
Малъ Скрылевъ

Odpowiedzi:

785

Aktualizacja z czasów współczesnych, jak stwierdził mimoralea :

Jeśli używasz Ruby 2.0 lub 2.2 (dzięki @ Patrick-Davey).

sudo apt-get install ruby2.0-dev
sudo apt-get install ruby2.2-dev
sudo apt-get install ruby2.3-dev

lub ogólny sposób:

sudo apt-get install ruby-dev

lub

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

Pierwszy opublikowany link jest dokładnie w twoim przypadku: nie ma zainstalowanego środowiska programowania Ruby. Środowisko programistyczne jest potrzebne do kompilacji rozszerzeń Ruby, które są w większości napisane C. Serwer proxy nie ma nic wspólnego z problemem: wszystko jest pobierane dobrze, po prostu kompilacja kończy się niepowodzeniem.

Proponuję zainstalować pakiet ruby-dev( ruby-develdla dystrybucji opartych na rpm) na komputerze docelowym.

gcc pakiet może być również potrzebny.

Próbować:

$ sudo apt-get install ruby-dev

Lub, dla dystrybucji Redhat:

$ sudo yum install ruby-devel

Lub, dla [otwórz] SuSE:

$ sudo zypper install ruby-devel
Aleksei Matiushkin
źródło
2
Dzięki! Miałem na myśli, że odpowiedź na to pytanie wydawała się specyficzna dla modułu. Myślę, że zamiast ruby-devITS ruby-devel. Oto, gdzie znalazłem dokładnie to, co potrzebne - digitalocean.com/community/articles/...
Navneet
9
Po zainstalowaniu ruby-devel (na Fedorze 20) otrzymałem błąd *** extconf.rb nie powiodło się ***. Po zainstalowaniu gcc, jak sugerowałeś, wszystko działało dobrze.
Wayne Riesterer
Możesz dodać sudo zypper install ruby-develdla openSUSE
superbob
To nic nie robi na Ubuntu. Brakujący pakiet to ruby2.2-dev(lub dowolna wersja, którą zainstalowałeś).
Luís de Sousa
2
Nie, ta odpowiedź nie pomogła w rozwiązaniu czegokolwiek. Prawidłowa odpowiedź to odpowiedź mimoralea .
Luís de Sousa
177

W przypadku Xcode 11 w systemie macOS 10.14 może się to zdarzyć nawet po zainstalowaniu Xcode i zainstalowaniu narzędzi wiersza polecenia i zaakceptowaniu licencji z

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

Problem polega na tym, że Xcode 11 dostarcza zestaw SDK dla macOS 10.15, który zawiera nagłówki dla ruby2.6, ale nie dla ruby2.3 dla macOS 10.14. Możesz sprawdzić, czy to jest twój problem, uruchamiając

ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

który na MacOS 10.14 z Xcode 11 drukuje nieistniejącą ścieżkę

/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

Jednak Xcode 11 instaluje w systemie macOS 10.14 SDK /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk. Nie jest konieczne zanieczyszczanie katalogów systemowych przez instalowanie starych plików nagłówkowych, jak sugerowano w innych odpowiedziach. Zamiast tego, wybierając ten zestaw SDK, zostaną znalezione odpowiednie nagłówki ruby2.3:

sudo xcode-select --switch /Library/Developer/CommandLineTools
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

To powinno teraz poprawnie wydrukować

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0

Podobnie gem installpowinien działać, gdy ten zestaw SDK jest wybrany.

Aby wrócić do bieżącego zestawu SDK Xcode, użyj

sudo xcode-select --switch /Applications/Xcode.app
joki
źródło
14
Legenda. Dokładnie mój problem z 10.14.6. Smutny nie może głosować dwukrotnie.
Diego Freniche
2
Pan, pan, jest niejasnym władcą wiedzy. Wielkie dzięki,
Rubin Simons,
Dziękujemy za szczegółowe informacje! W końcu zadziałało, produkując „BŁĄD: Błąd instalacji jekyll: jekyll-sass-converter wymaga wersji Ruby> = 2.4.0.”. To mnie rozśmiesza.
Nickolay Olshevsky
@NickolayOlshevsky w takim przypadku musisz zainstalować Ruby poprzez Homebrew, obecnie w wersji 2.6.5.
joki
1
Jesteś cholerną legendą kodowania.
Aljosha Novakovic
75

W przypadku korzystania z Ruby 2.0 lub 2.2 (dzięki @ Patrick-Davey) lub 2.3 (dzięki @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

Dostajesz tutaj wzór ...

mimoralea
źródło
6
Lub, jeśli używasz 2.2 ...sudo apt-get install ruby2.2-dev
patrickdavey
@ patrick-davey E: Unable to locate package ruby2.2-dev E: Couldn't find any package by regex 'ruby2.2-dev'
Aparichith
@dson prawdopodobnie używasz starej wersji Ubuntu. Spróbuj zaktualizować.
Pithikos,
Wystąpił również ten sam błąd i używam w pełni zaktualizowanej wersji Linux Mint. Nie sądzę, że wersja systemu operacyjnego jest problemem.
Andrew Faulkner,
2
Jeśli używasz starej wersji Ubuntu, takiej jak Trusty (14.04), dodaj brightbox PPA dla Ruby:sudo apt-add-repository -y ppa:brightbox/ruby-ng && sudo apt-get update && sudo apt-get install -y ruby2.2-dev
Siddhu
19

Dla tych, którzy dostają to na Mac OS X, może być konieczne uruchomienie następującego polecenia, aby zainstalować narzędzia wiersza polecenia XCode, nawet jeśli masz już zainstalowany XCode:

sudo xcode-select --install

Musisz także uzgodnić warunki XCode, uruchamiając następującą komendę:

sudo xcodebuild -license
Juan De León
źródło
To była dla mnie poprawna odpowiedź. Nie miałem nagłówków Ruby Development. Po zainstalowaniu xCode oryginalne polecenie, które próbowałem uruchomić, działało. Dzięki!
Sweet Chilly Philly
Na OSX z Mojave musiałem uruchomić to jako:su - $USER -c 'xcode-select --install'
Belden,
To też działało dla mnie.
adougies
11

Miałem podobny problem z użyciem cygwin do uruchomienia następującego polecenia:

$ gem install rerun

Rozwiązałem go, instalując następujące pakiety cygwin:

  • ruby-devel
  • libffi-devel
  • gcc-core
  • gcc-g ++
  • robić
  • automake1.15
Kinifwyne
źródło
To segfault dla mnie:/cygdrive/z/.gem/ruby/extensions/x86-cygwin/json-1.8.3/json/ext/parser.so: [BUG] Segmentation fault at 0x0001b8
rr-
Rozwiązane przez wykonanie rm -rf ~/.gem/i ponowne wydanie polecenia.
rr-
ruby-devna raspberry pi
CONvid19
11

Większość głosowanych rozwiązań nie działa na mojej maszynie (Linux 18.04). Po dokładnym przyjrzeniu się zauważyłem, że brakuje g ++. Rozwiązany z

sudo apt-get install g ++

Miles Davis
źródło
1
To działało dla mnie na Ubuntu 18.04. Musiałem też wykonać sudo apt-get przed uruchomieniem g ++.
Scott Lindner,
Potwierdź instalację makei g++naprawiłem również mój problem na Ubuntu 18.04!
Arda
9

w przypadku korzystania z SUSE

sudo yast2 -i ruby-devel
Prokur
źródło
2
Wolę sudo zypper in ruby-devel.
Lesik2008
5

Xcode 11 / macOS Catalina

W Xcode 11 / macOS Catalina pliki nagłówkowe nie są już w starej lokalizacji, a stary /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgplik nie jest już dostępny.

Zamiast tego nagłówki są teraz instalowane w /usr/includekatalogu bieżącej ścieżki SDK:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

Większość tego katalogu można znaleźć za pomocą danych wyjściowych xcrun --show-sdk-path. A jeśli dodasz tę ścieżkę do CPATHzmiennej środowiskowej, wówczas skrypty kompilacji (w tym te wywoływane przez bundle) będą na ogół w stanie ją znaleźć.

Rozwiązałem ten problem, ustawiając CPATHmój .zshrcplik:

export CPATH="$(xcrun --show-sdk-path)/usr/include"

Po otwarciu nowej powłoki (lub uruchomieniu source .zshrc) nie otrzymuję już komunikatu o błędzie mkmf.rb nie mogę znaleźć plików nagłówkowych dla ruby ​​w /usr/lib/ruby/ruby.h, a rubygemy instalują się poprawnie.

Uwaga dotycząca budowania na platformach innych niż macOS

Jeśli budujesz na platformach innych niż macOS, takich jak iOS / tvOS / watchOS, ta zmiana będzie próbowała włączyć SDK macOS na tych platformach, powodując błędy kompilacji. Aby rozwiązać problem, nie ustawiaj CPATHzmiennej środowiskowej przy logowaniu lub tymczasowo ustaw ją na pustą, gdy działa xcodebuildtak:

CPATH="" xcodebuild --some-args
Aaron Brager
źródło
2
Czy masz dokumentację dotyczącą CPATH? Ustawienie go nie rozwiązuje problemu. Kiedy sprawdziłem, jego wartość na pierwszym miejscu wydawała się niezdefiniowana.
Ilias Karim
1
gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html - może być konieczne znalezienie innej zmiennej środowiskowej w zależności od używanego języka / kompilatora. To normalne, że byłoby domyślnie rozbrojone
Aaron Brager
A jeśli nie widziałeś go gdzie indziej, na ścieżce / nazwie Xcode nie może być spacji
Feldur
Ze wszystkich odpowiedzi tutaj, to jedyne rozwiązanie, które działało dla mnie. Jestem na Mojave 10.14.6i XCode 11.3.1. Dziękuję bardzo, zajęło mi 1 dzień, aby rozwiązać ten problem: /
user2350644
4

W Fedorze 21 i nowszych wystarczy otworzyć terminal i zainstalować pliki Ruby Development jako root.

dnf install ruby-devel
emmojo
źródło
2

Może być konieczne zainstalowanie gcc po instalacji ruby-devel

bott
źródło
1

Xcode -> Preferencje -> Lokalizacje

zmień Narzędzia wiersza poleceń na Xcode 11.2.1

Chester Fang
źródło
1

Na komputerze Mac 10.14 pliki nagłówkowe nie wydają się być zainstalowane we właściwym miejscu. Zamiast zmieniać ścieżki jak inne poprawki, mogłem po prostu uruchomić to:

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

Postępuj zgodnie z instrukcjami, aby rozwiązać ten problem.

Shawn Lauzon
źródło
0

Musisz zainstalować cały rubin, a nie tylko minimalną paczkę. Prawidłowe polecenie do użycia to:

sudo apt install ruby-full

Następujące polecenie również nie zainstaluje pełnego ruby:

sudo apt-get install ruby2.3-dev
aleksander_si
źródło
0

W przypadku Ubuntu 18, po sprawdzeniu pliku dziennika wymienionego podczas instalacji

Wyniki są rejestrowane w /var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

z

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

Zauważyłem, że makenie znaleziono. Tak zainstalowane

sudo apt-get install make

wszystko działało

Gökçer Gökdal
źródło
-2
sudo apt-get --reinstall install ruby

wypróbuj dla Ubuntu 16.04

Ajmal Aamir
źródło