Erreur lors de l'installation de json gem 'mkmf.rb ne trouve pas les fichiers d'en-tête pour ruby'

407

Pour le contexte, c'est sur un serveur distant qui a un pare-feu. Je configure mon environnement via un proxy. Je l'ai ruby 1.8.7. Lorsque j'essaie d'installer gem ..

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

J'obtiens l'erreur suivante:

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

Comme je ne savais pas quel était le problème, j'ai cherché sur Google et trouvé ces

Des indices? Merci!

Navneet
la source
vérifiez la présence du /usr/lib/ruby/ruby.hfichier, s'il est présent, montrez-nous un message d'erreur de gem_make.out.
Малъ Скрылевъ

Réponses:

786

Mise à jour de l'ère moderne, comme l'a déclaré mimoralea :

Dans le cas où vous utilisez ruby ​​2.0 ou 2.2 (merci @ patrick-davey).

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

ou, de manière générique:

sudo apt-get install ruby-dev

ou

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

Le premier lien que vous avez publié est exactement votre cas: aucun environnement de développement ruby ​​n'est installé. L'env de développement est nécessaire pour compiler les extensions ruby, qui sont principalement écrites en C. Le proxy n'a rien à voir avec le problème: tout est bien téléchargé, la compilation échoue.

Je vous suggère d'installer le package ruby-dev( ruby-develpour les distributions basées sur les rpm) sur votre machine cible.

gcc le package peut également être nécessaire.

Essayer:

$ sudo apt-get install ruby-dev

Ou, pour la distribution Redhat:

$ sudo yum install ruby-devel

Ou, pour [open] SuSE:

$ sudo zypper install ruby-devel
Aleksei Matiushkin
la source
2
Merci! Je voulais dire que la réponse à cette question semblait spécifique au module. Je pense au lieu de ruby-devson ruby-devel. Voici où j'ai trouvé exactement ce dont j'avais besoin - digitalocean.com/community/articles/…
Navneet
9
Après l'installation de ruby-devel (sur Fedora 20), j'ai eu l'erreur *** extconf.rb a échoué ***. Une fois l'installation de gcc comme vous l'avez suggéré, tout a bien fonctionné.
Wayne Riesterer
Vous pouvez ajouter sudo zypper install ruby-develpour openSUSE
superbob
Cela ne fait rien sur Ubuntu. Le package manquant est ruby2.2-dev(ou la version que vous avez installée).
Luís de Sousa
2
Non, cette réponse n'a pas aidé à résoudre quoi que ce soit. La bonne réponse est celle de mimoralea .
Luís de Sousa
178

Pour Xcode 11 sur macOS 10.14 , cela peut se produire même après avoir installé Xcode et installé les outils de ligne de commande et accepté la licence avec

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

Le problème est que Xcode 11 expédie le SDK macOS 10.15 qui comprend des en-têtes pour ruby2.6, mais pas pour ruby2.3 de macOS 10.14. Vous pouvez vérifier que c'est bien votre problème en exécutant

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

qui sur macOS 10.14 avec Xcode 11 imprime le chemin inexistant

/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

Cependant, Xcode 11 installe un SDK macOS 10.14 dans /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk. Il n'est pas nécessaire de polluer les répertoires système en installant les anciens fichiers d'en-tête comme suggéré dans d'autres réponses. Au lieu de cela, en sélectionnant ce SDK, les en-têtes ruby2.3 appropriés seront trouvés:

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

Cela devrait maintenant s'imprimer correctement

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

De même, gem installdevrait fonctionner pendant que ce SDK est sélectionné.

Pour revenir au SDK Xcode actuel, utilisez

sudo xcode-select --switch /Applications/Xcode.app
joki
la source
14
Légende. Exactement mon problème sur 10.14.6. Triste ne peut pas voter deux fois.
Diego Freniche
2
Vous, monsieur, êtes un suzerain obscur de la connaissance. Merci beaucoup,
Rubin Simons
Merci pour les informations détaillées! Cela a finalement fonctionné, produisant "ERREUR: erreur lors de l'installation de jekyll: le convertisseur jekyll-sass nécessite la version Ruby> = 2.4.0.". Ça me fait rire.
Nickolay Olshevsky
@NickolayOlshevsky dans ce cas, vous devez installer ruby ​​via homebrew, actuellement à la version 2.6.5.
joki
1
Vous, la folle légende du codage.
Aljosha Novakovic
75

Dans le cas où vous utilisez ruby ​​2.0 ou 2.2 (merci @ patrick-davey) ou 2.3 (merci @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

Et vous obtenez le motif ici ...

mimoralea
la source
6
Ou, si vous utilisez 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 vous utilisez probablement une ancienne version d'Ubuntu. Essayez la mise à niveau.
Pithikos
J'ai également la même erreur et j'utilise une version entièrement mise à jour de Linux Mint. Je ne pense pas que la version OS soit le problème.
Andrew Faulkner
2
Si vous utilisez une ancienne version d'Ubuntu telle que Trusty (14.04), ajoutez le PPA Brightbox pour Ruby:sudo apt-add-repository -y ppa:brightbox/ruby-ng && sudo apt-get update && sudo apt-get install -y ruby2.2-dev
Siddhu
22

J'ai également rencontré ce problème parce que j'installe Ruby sur Ubuntu via Brightbox , et je pensais que ruby-dev est le tronc de Ruby . Je n'ai donc pas installé. Installer ruby2.3-dev le corrige:

sudo apt-get install ruby2.3-dev
Juanito Fatas
la source
19

Pour ceux qui obtiennent cela sur Mac OS X, vous devrez peut-être exécuter la commande suivante pour installer les outils de ligne de commande XCode, même si XCode est déjà installé:

sudo xcode-select --install

Vous devez également accepter les termes et conditions de XCode en exécutant la commande suivante:

sudo xcodebuild -license
Juan De León
la source
C'était la bonne réponse pour moi. Je n'avais pas d'en-têtes de développement Ruby. Une fois que j'ai installé xCode, la commande d'origine que j'ai essayée a fonctionné. Merci!
Sweet Chilly Philly
Sur OSX avec Mojave, je devais exécuter cela comme:su - $USER -c 'xcode-select --install'
Belden
Cela a également fonctionné pour moi.
adougies
11

J'ai eu un problème similaire en utilisant cygwin pour exécuter la commande suivante:

$ gem install rerun

Je l'ai résolu en installant les packages cygwin suivants:

  • ruby-devel
  • libffi-devel
  • gcc-core
  • gcc-g ++
  • faire
  • automake1.15
Kinifwyne
la source
Ce segfaults pour moi:/cygdrive/z/.gem/ruby/extensions/x86-cygwin/json-1.8.3/json/ext/parser.so: [BUG] Segmentation fault at 0x0001b8
rr-
Résolu en exécutant rm -rf ~/.gem/et en réexécutant la commande.
rr-
ruby-devsur raspberry pi
CONvid19
11

La solution la plus votée n'a pas fonctionné sur ma machine (Linux Mint 18.04). Après un examen attentif, j'ai trouvé que g ++ manquait. Résolu avec

sudo apt-get install g ++

Miles Davis
la source
1
Cela a fonctionné pour moi sur Ubuntu 18.04. J'ai également dû faire une sudo apt-get install make avant que l'installation de g ++ ne fonctionne.
Scott Lindner
Peut également confirmer l'installation makeet la g++résolution de mon problème sur Ubuntu 18.04!
Arda
9

au cas où vous utilisez SUSE

sudo yast2 -i ruby-devel
Prokur
la source
2
Je préfère sudo zypper in ruby-devel.
Lesik2008
5

Xcode 11 / macOS Catalina

Sur Xcode 11 / macOS Catalina, les fichiers d'en-tête ne se trouvent plus à l'ancien emplacement et l'ancien /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgfichier n'est plus disponible.

Au lieu de cela, les en-têtes sont maintenant installés dans le /usr/includerépertoire du chemin actuel du SDK:

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

La plupart de ce répertoire peut être trouvé en utilisant la sortie de xcrun --show-sdk-path. Et si vous ajoutez ce chemin à la CPATHvariable d'environnement, alors les scripts de construction (y compris ceux appelés via bundle) seront généralement en mesure de le trouver.

J'ai résolu cela en définissant mon CPATHdans mon .zshrcfichier:

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

Après avoir ouvert un nouveau shell (ou exécuté source .zshrc), je ne reçois plus le message d'erreur mkmf.rb ne trouve pas les fichiers d'en-tête pour ruby ​​dans /usr/lib/ruby/ruby.h et les rubygems s'installent correctement.

Remarque sur la création de plates-formes non macOS

Si vous construisez sur des plates-formes non macOS, telles que iOS / tvOS / watchOS, cette modification tentera d'inclure le SDK macOS dans ces plates-formes, provoquant des erreurs de génération. Pour résoudre ce problème, ne définissez pas CPATHla variable d'environnement lors de la connexion ou définissez-la temporairement sur vide lors de l'exécution xcodebuildcomme suit:

CPATH="" xcodebuild --some-args
Aaron Brager
la source
2
Avez-vous de la documentation sur CPATH? Le régler ne résout pas le problème pour moi. Lorsque j'ai vérifié sa valeur à sa première place, elle est apparue indéfinie.
Ilias Karim
1
gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html - vous devrez peut-être trouver une variable d'environnement différente selon la langue / le compilateur que vous utilisez. Il est normal qu'il ne soit pas réglé par défaut
Aaron Brager
Et, au cas où vous ne l'auriez pas vu ailleurs, il ne peut pas y avoir d'espaces dans le chemin / nom Xcode
Feldur
De toutes les réponses ici, c'est la seule solution qui a fonctionné pour moi. Je suis sur Mojave 10.14.6et XCode 11.3.1. Merci beaucoup, il m'a fallu 1 jour pour résoudre ce problème: /
user2350644
4

Dans Fedora 21 et plus, vous ouvrez simplement un terminal et installez les fichiers de développement Ruby en tant que root.

dnf install ruby-devel
emmojo
la source
2

Vous devrez peut-être installer gcc après l'installation de ruby-devel

bott
la source
1

Xcode -> Préférences -> Emplacements

changer les outils de ligne de commande en Xcode 11.2.1

Chester Fang
la source
1

Sur Mac 10.14, les fichiers d'en-tête ne semblent pas être installés au bon endroit. Plutôt que de changer de chemin comme les autres correctifs, j'ai pu simplement exécuter ceci:

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

Suivez les instructions et cela a résolu ce problème pour moi.

Shawn Lauzon
la source
0

Vous devez installer le rubis entier et pas seulement le paquet minimum. La commande correcte à utiliser est:

sudo apt install ruby-full

La commande suivante n'installera pas non plus un rubis complet:

sudo apt-get install ruby2.3-dev
aleksander_si
la source
0

Pour Ubuntu 18, après avoir vérifié le fichier journal mentionné lors de l'installation

Résultats enregistrés dans /var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

avec

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

J'ai remarqué que cela makene se trouve pas. Alors installé faire par

sudo apt-get install make

tout fonctionnait.

Gökçer Gökdal
la source
-2
sudo apt-get --reinstall install ruby

essayez-le pour ubuntu 16.04

Ajmal Aamir
la source