Errore durante l'installazione di json gem 'mkmf.rb non riesce a trovare i file di intestazione per ruby'


407

Per il contesto, su un server remoto che ha un firewall. Sto configurando il mio ambiente tramite un proxy. Io ho ruby 1.8.7. Quando provo a installare gem ..

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

Ottengo il seguente errore:

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

Dato che non ero sicuro di quale fosse il problema, ho cercato su Google e ho trovato questi

Qualche suggerimento? Grazie!


controlla la presenza del /usr/lib/ruby/ruby.hfile, se presente, mostraci il messaggio di errore da gem_make.out.
Малъ Скрылевъ,

Risposte:


786

Aggiornamento dell'era moderna, come affermato da mimoralea :

Nel caso in cui tu stia usando ruby ​​2.0 o 2.2 (grazie a @ patrick-davey).

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

o, modo generico:

sudo apt-get install ruby-dev

o

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

Il primo link che hai pubblicato è esattamente il tuo caso: non è installato alcun ambiente di sviluppo ruby. Lo sviluppo env è necessario per compilare estensioni ruby, che sono per lo più scritte C. Il proxy non ha nulla a che fare con il problema: tutto viene scaricato correttamente, solo la compilazione fallisce.

Ti suggerirei di installare il pacchetto ruby-dev( ruby-develper distribuzioni basate su rpm) sul tuo computer di destinazione.

gcc potrebbe essere necessario anche il pacchetto.

Provare:

$ sudo apt-get install ruby-dev

Oppure, per Redhat distro:

$ sudo yum install ruby-devel

Oppure, per [aperto] SuSE:

$ sudo zypper install ruby-devel

2
Grazie! Intendevo dire che la risposta a quella domanda sembrava specifica per il modulo. Penso al posto ruby-devsuo ruby-devel. Ecco dove ho trovato quello di cui avevo esattamente bisogno: digitalocean.com/community/articles/…
Navneet,

9
Dopo aver installato ruby-devel (su Fedora 20), ho avuto l'errore *** extconf.rb fallito ***. Una volta installato gcc come hai suggerito, tutto ha funzionato bene.
Wayne Riesterer,

È possibile aggiungere sudo zypper install ruby-develper openSUSE
superbob

Questo non fa nulla su Ubuntu. Il pacchetto mancante è ruby2.2-dev(o la versione installata).
Luís de Sousa,

2
No, questa risposta non ha aiutato a risolvere nulla. La risposta giusta è quella di mimoralea .
Luís de Sousa,

178

Per Xcode 11 su macOS 10.14 , ciò può accadere anche dopo l'installazione di Xcode e l'installazione di strumenti da riga di comando e l'accettazione della licenza con

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

Il problema è che Xcode 11 include macOS 10.15 SDK che include le intestazioni per ruby2.6, ma non per ruby2.3 di macOS 10.14. Puoi verificare che questo sia il tuo problema eseguendo

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

che su macOS 10.14 con Xcode 11 stampa il percorso inesistente

/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

Tuttavia, Xcode 11 installa un SDK macOS 10.14 all'interno /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk. Non è necessario inquinare le directory di sistema installando i vecchi file di intestazione come suggerito in altre risposte. Invece, selezionando quell'SDK, verranno trovate le intestazioni ruby2.3 appropriate:

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

Questo dovrebbe ora stampare correttamente

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

Allo stesso modo, gem installdovrebbe funzionare mentre è selezionato quell'SDK.

Per tornare all'SDK Xcode corrente, utilizzare

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

14
Leggenda. Esattamente il mio problema con 10.14.6. Il triste non può votare due volte.
Diego Freniche,

2
Lei, signore, è un oscuro signore della conoscenza. Mille grazie,
Rubin Simons,

Grazie per le informazioni dettagliate! Alla fine ha funzionato, producendo "ERRORE: errore durante l'installazione di jekyll: jekyll-sass-converter richiede la versione di Ruby> = 2.4.0.". Questo mi fa ridere.
Nickolay Olshevsky,

@NickolayOlshevsky in quel caso, devi installare ruby ​​tramite homebrew, attualmente alla versione 2.6.5.
joki,

1
Sei una strana leggenda del codice.
Aljosha Novakovic

75

Nel caso in cui usi ruby ​​2.0 o 2.2 (grazie a @ patrick-davey) o 2.3 (grazie a @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

E ottieni lo schema qui ...


6
Oppure, se stai usando 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 probabilmente usi una vecchia versione di Ubuntu. Prova ad aggiornare.
Pithikos,

Ho anche avuto lo stesso errore e sto usando una versione completamente aggiornata di Linux Mint. Non credo che la versione del sistema operativo sia il problema.
Andrew Faulkner,

2
Se stai usando una vecchia versione di Ubuntu come Trusty (14.04), aggiungi il PPA Brightbox per Ruby:sudo apt-add-repository -y ppa:brightbox/ruby-ng && sudo apt-get update && sudo apt-get install -y ruby2.2-dev
Siddhu,


19

Per coloro che ottengono questo su Mac OS X potrebbe essere necessario eseguire il comando seguente per installare gli strumenti da riga di comando XCode, anche se XCode è già installato:

sudo xcode-select --install

Inoltre, devi accettare i termini e le condizioni di XCode eseguendo il comando seguente:

sudo xcodebuild -license

Questa è stata la risposta corretta per me. Non avevo intestazioni di sviluppo di Ruby. Una volta installato xCode il comando originale che ho provato a funzionare ha funzionato. Grazie!
Sweet Chilly Philly,

Su OSX con Mojave ho dovuto eseguirlo come:su - $USER -c 'xcode-select --install'
Belden l'

Questo ha funzionato anche per me.
adougies

11

Ho avuto un problema simile utilizzando Cygwin per eseguire il comando seguente:

$ gem install rerun

L'ho risolto installando i seguenti pacchetti cygwin:

  • ruby-devel
  • libffi-devel
  • gcc-core
  • gcc-g ++
  • rendere
  • automake1.15

Questo segfault per me:/cygdrive/z/.gem/ruby/extensions/x86-cygwin/json-1.8.3/json/ext/parser.so: [BUG] Segmentation fault at 0x0001b8
rr-

Risolto eseguendo rm -rf ~/.gem/e riemettendo il comando.
r-

ruby-devon raspberry pi
CONvid19

11

La soluzione più votata non ha funzionato sulla mia macchina (Linux mint 18.04). Dopo uno sguardo attento, ho scoperto che mancava g ++. Risolto con

sudo apt-get install g ++


1
Questo ha funzionato per me su Ubuntu 18.04. Ho anche dovuto fare un'installazione sudo apt-get make prima dell'installazione di g ++ per funzionare.
Scott Lindner,

Posso confermare l'installazione makee g++risolvere il mio problema anche su Ubuntu 18.04!
Arda,

9

nel caso in cui usi SUSE

sudo yast2 -i ruby-devel

2
Io preferisco sudo zypper in ruby-devel.
Lesik2008,

5

Xcode 11 / macOS Catalina

Su Xcode 11 / macOS Catalina, i file di intestazione non si trovano più nella vecchia posizione e il vecchio /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgfile non è più disponibile.

Invece, le intestazioni sono ora installate nella /usr/includedirectory del percorso SDK corrente:

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

La maggior parte di questa directory può essere trovata usando l'output di xcrun --show-sdk-path. E se aggiungi questo percorso alla CPATHvariabile d'ambiente, allora gli script di compilazione (compresi quelli chiamati via bundle) saranno generalmente in grado di trovarlo.

Ho risolto questo impostando my CPATHnel mio .zshrcfile:

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

Dopo aver aperto una nuova shell (o in esecuzione source .zshrc), non ricevo più il messaggio di errore mkmf.rb non riesco a trovare i file di intestazione per ruby ​​su /usr/lib/ruby/ruby.h e rubygems si installa correttamente.

Nota sulla creazione di piattaforme non macOS

Se stai realizzando piattaforme non macOS, come iOS / tvOS / watchOS, questa modifica tenterà di includere macOS SDK in tali piattaforme, causando errori di compilazione. Per risolvere il problema, non impostare CPATHla variabile di ambiente al momento dell'accesso o impostarla temporaneamente su vuota quando in esecuzione in questo xcodebuildmodo:

CPATH="" xcodebuild --some-args

2
Hai qualche documentazione su CPATH? L'impostazione non risolve il problema per me. Quando ho controllato il suo valore al primo posto, è apparso indefinito.
Ilias Karim,

1
gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html - potrebbe essere necessario trovare una variabile di ambiente diversa a seconda della lingua / compilatore che si sta utilizzando. È normale che non sia impostato di default
Aaron Brager,

E, nel caso in cui non l'avessi visto altrove, non possono esserci spazi nel percorso / nome Xcode
Feldur,

Da tutte le risposte qui, questa è l'unica soluzione che ha funzionato per me. Sono su Mojave 10.14.6e XCode 11.3.1. Grazie mille, mi ci è voluto 1 giorno per risolvere questo problema: /
user2350644

4

In Fedora 21 e versioni successive, è sufficiente aprire un terminale e installare i file di sviluppo di Ruby come root.

dnf install ruby-devel

2

Potrebbe essere necessario installare gcc dopo l'installazione di ruby-devel


1

Xcode -> Preferenze -> Posizioni

cambia gli strumenti da riga di comando in Xcode 11.2.1


1

Su Mac 10.14, i file di intestazione non sembrano essere installati nella posizione corretta. Invece di cambiare percorso come le altre correzioni, sono stato in grado di eseguire solo questo:

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

Segui le istruzioni e ha risolto questo problema per me.


0

Devi installare l'intero rubino e non solo il pacchetto minimo. Il comando corretto da usare è:

sudo apt install ruby-full

Il seguente comando non installa inoltre un rubino completo:

sudo apt-get install ruby2.3-dev

0

Per Ubuntu 18, dopo aver verificato il file di registro menzionato durante l'installazione

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

con

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

Ho notato che makenon è stato trovato. Così installato da

sudo apt-get install make

tutto ha funzionato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.