Sur un Windows 7 Professionnel 64 bits fraîchement installé, j'ai installé Cygwin (64) et certains de ses packages, y compris Ruby. J'ai également installé Ruby à l'aide du programme d'installation de Ruby, car j'en aurai probablement besoin à la fois pour les shells Windows par défaut et pour Cygwin.
Maintenant, quand j'essaye d'exécuter un gem
commande comme gem list
ou gem install foo
, Je reçois une erreur étrange que je n’ai pas résolue au cours des dernières heures de recherche sur Internet.
$ which ruby
/usr/bin/ruby
$ which gem
/usr/bin/gem
$ ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-cygwin]
$ gem -v
2.4.8
$ gem list
ERROR: Loading command: list (Fiddle::DLError)
can't load kernel32
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
$ gem install sass
ERROR: Loading command: install (Fiddle::DLError)
can't load kernel32
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
Cependant, avec la version Windows native, à partir du CMD Windows, cela fonctionne sans problème. Je ne peux cependant pas utiliser les éléments Windows Ruby natifs de Cygwin, car cela me donne des erreurs, mais ce n’est pas la question qui se pose ici.
Avec Process Monitor, j'ai compris que Ruby essayait d'ouvrir C:\cygwin64\bin\kernel32.dll
et échoue, car ce fichier n’est pas là. J'ai essayé de copier le kernel32.dll
de C:\Windows\System32
et celui de C:\Windows\SysWOW64
dans ce Cygwin bin
dossier et toujours la même erreur (à part cela, il a ensuite dit ne peut pas charger kernel32.dll ), bien que le moniteur de processus n’ait pas montré de NAME NOT FOUND
erreur plus.
Quelle magie se passe ici? J'aimerais vraiment comprendre ce qui ne va pas ici. J'apprécie toute aide.
Une façon de résoudre ce problème sans changer le processus de construction de rvm est la suivante:
ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32
Cela se produit parce que ruby recherche une bibliothèque partagée nommée simplement
kernel32
. Cygwin 2.5.1 et versions antérieures ont automatiquement ajouté l’extension ".dll" aux chargements de bibliothèques partagées. Mais cygwin 2.5.2 a introduit un correctif nécessitant des noms de fichiers de bibliothèque partagés complets. Ajout d’un lien symbolique dans le chemin de recherche de la bibliothèque (/usr/lib
) permet de retrouver la bibliothèque même chargée avec l'ancien nom.la source
resolv.rb
. Travaillé avec Cygwin 2.6.0 et rbenvJ'ai installé ruby en utilisant rvm, de sorte que les fichiers binaires ruby Cygwin mis à jour ne m'ont pas beaucoup aidé et que je ne voulais pas vraiment rétrograder mon installation Cygwin. Comment saurais-je que la mise à niveau est sûre?
À la suite des informations contenues dans la réponse de Michael D, le problème semble être lié à la
resolv.rb
fichier situé dans~\.rvm\rubies\ruby-<version>\lib\ruby\<version>\win32
(dans mon cas~\.rvm\rubies\ruby-2.1.7\lib\ruby\2.1.0\win32
).Quelque part vers le haut de ce fichier, il y a le code
Changer simplement le
dlload "kernel32"
ligne àdlload "kernel32.dll"
semblait le réparer pour moi. Alternativement en utilisant le chemin completCela a également fonctionné, mais il semble que l'extension soit l'élément le plus important (le chemin complet sans l'extension ne fonctionne pas non plus).
Cela a peut-être été corrigé dans une version plus récente de rvm, mais je ne voulais pas passer par les tracas de la mise à jour et de la réinstallation, cela fonctionne donc pour moi. Bien sûr, cela devrait probablement être changé pour tous les rubis installés.
la source
Le package Ruby rencontre des difficultés pour charger les bibliothèques natives (au moins kernel32.dll). Le problème vient d'un appel à
dns.getresource("_rubygems._tcp.#{host}", Resolv::DNS::Resource::IN::SRV)
qui fait probablement un appel natif àkernel32.dll
d'où le chargement dukernel32.dll
bibliothèque.Si vous spécifiez le chemin complet de la bibliothèque, cela fonctionnera correctement.
Pour résoudre le problème, essayez ce qui suit:
devkit
en cours d'exécutionextconf.rb
comme suit:ruby -rdevkit extconf.rb
ou simplement en ajoutantrequire "devkit"
àextconf.rb
puis en exécutant le script normalement.devkitvars.bat
script du devkit pour configurer lePATH
avec la chaîne d’outils avant de compiler.la source
gem
, pas de scripts de mon côté. Donc, je ne suis pas en mesure de spécifier un chemin complet et je ne sais pas quel est leextconf.rb
n’est ni comment ni quand l’utiliser. Je ne compile rien non plus. S'il vous plaît donner quelques instructions supplémentaires afin que je puisse tester ce que vous avez conseillé.extconf.rb
se il vous plaît se référer ici . Pour vérifier le chargement dekernel32.dll
Essayez d'utiliser ce scénario.