Juwel funktioniert nicht in Cygwin

2449
Neon

Auf einem frisch installierten Windows 7 Professional 64 Bit installierte ich Cygwin (64) und einige seiner Pakete, einschließlich Ruby. Ich habe Ruby auch mit dem Ruby-Installationsprogramm installiert, da ich es wahrscheinlich für die Standard-Windows-Shells und Cygwin benötige.

Wenn ich nun versuche, einen gemBefehl wie gem listoder auszuführen gem install foo, erhalte ich einen seltsamen Fehler, den ich in den letzten Stunden der Suche im Internet nicht beheben konnte.

$ 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 

Mit der nativen Windows-Version von Windows CMD ist dies jedoch problemlos möglich. Ich kann jedoch keine nativen Windows-Ruby-Dateien von Cygwin verwenden, da mir dies Fehler gibt, aber das ist hier sowieso nicht die Frage.

Mit Process Monitor habe ich herausgefunden, dass Ruby versucht zu öffnen C:\cygwin64\bin\kernel32.dllund fehlschlägt, da diese Datei nicht vorhanden ist. Ich habe versucht, das kernel32.dllfrom C:\Windows\System32und das from from C:\Windows\SysWOW64in diesen Cygwin- binOrdner zu kopieren und bekam trotzdem den gleichen Fehler (abgesehen davon, dass er kernel32.dll nicht laden kann ), obwohl der Prozessmonitor keinen NAME NOT FOUNDFehler mehr zeigte.

Welche Magie passiert hier? Ich würde wirklich gerne verstehen, was hier falsch ist. Ich freue mich über jede Hilfe.

4

4 Antworten auf die Frage

6
tombrown52

Sie können dies beheben, ohne den Build-Prozess von rvm zu ändern:

ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32

Dies geschieht, weil Ruby nach einer einfach benannten Bibliothek sucht kernel32. Cygwin 2.5.1 und frühere Versionen haben automatisch die Erweiterung ".dll" zum Laden von gemeinsam genutzten Bibliotheken hinzugefügt. In cygwin 2.5.2 wurde jedoch ein Patch eingeführt, der vollständige Dateinamen für gemeinsam genutzte Bibliotheken erfordert. Durch das Hinzufügen eines symbolischen Links innerhalb des Bibliotheks-Suchpfads ( /usr/lib) kann die Bibliothek auch dann gefunden werden, wenn sie mit dem alten Namen geladen wird.

+1 IMHO ist diese Lösung die netteste, da die `resolv.rb` nicht bearbeitet werden muss. Arbeitete mit Cygwin 2.6.0 und rbenv edwardsmatt vor 7 Jahren 1
4
zelanix

Ich habe Ruby mit rvm installiert, so dass die aktualisierten Cygwin-Rubin-Binärdateien keine große Hilfe waren und ich meine Cygwin-Installation nicht wirklich downgraden wollte. Woher weiß ich, wann ein Upgrade sicher war?

Nach den Angaben in der Antwort von Michael D scheint das Problem in der resolv.rbDatei ~\.rvm\rubies\ruby-<version>\lib\ruby\<version>\win32(in meinem Fall ~\.rvm\rubies\ruby-2.1.7\lib\ruby\2.1.0\win32) zu liegen.

Am oberen Rand dieser Datei befindet sich der Code

module Kernel32 extend Importer dlload "kernel32" end 

Einfach die dlload "kernel32"Zeile zu ändern, dlload "kernel32.dll"schien das für mich zu beheben. Alternativ den vollständigen Pfad verwenden

dlload "c:/Windows/System32/kernel32.dll" 

funktionierte auch, aber es scheint die Erweiterung zu sein, die das entscheidende Bit darstellt (der vollständige Pfad ohne die Erweiterung funktioniert ebenfalls nicht).

Dies wurde möglicherweise in einer neueren Version von rvm behoben, aber ich wollte nicht den Aufwand des Aktualisierens und Neuinstallierens durchgehen, daher funktioniert das für mich. Natürlich müsste dies wahrscheinlich für alle installierten Rubine geändert werden.

[Das Problem ist seit dem 28. Juni gelöst] (https://www.cygwin.com/ml/cygwin-announce/2016-06/msg00054.html). Ich empfehle keine rvm-Installation von Cygwin. Ich hatte nur Probleme damit, spätestens wenn Edelsteine ​​kompiliert werden müssen. Und ich sehe keine Probleme mit der Cygwin-Version (abgesehen von dieser, die behoben wurde und leicht behoben werden konnte). Neon vor 7 Jahren 0
@Neon, ich bevorzuge die Verwendung von rvm, so dass ich problemlos verschiedene Ruby-Versionen testen und Gemsets verwenden kann, so dass für mich das Problem nicht gelöst wurde, sondern jeweils für sich. zelanix vor 7 Jahren 1
Cygwin bietet auch nicht die neuesten Ruby-Versionen an. Zum Beispiel ist 2.3.1 in den Repos nicht verfügbar. Es gibt auch Projekte, die * speziell * rvm verwenden, um die verwendete Ruby-Version ordnungsgemäß zu verwalten. Timotei vor 7 Jahren 0
3
matzeri

Es scheint ein unerwartetes Ergebnis der Veröffentlichung von cygwin 2.5.2 zu sein

https://www.cygwin.com/ml/cygwin/2016-06/msg00378.html

Reduzieren Sie das cygwin-Paket auf 2.5.1

Problem gelöst https://www.cygwin.com/ml/cygwin-announce/2016-06/msg00054.html matzeri vor 7 Jahren 0
"Problem gelöst" Das Problem wird nur behoben, wenn Sie Ruby über das Cygwin-Installationsprogramm installieren, oder? Ich erhalte diese Fehlermeldung, wenn ich versuche, über RVM zu installieren. Ich denke, meine einzige Möglichkeit ist das Downgrade von Cygwin. Ajedi32 vor 7 Jahren 0
Wenn Ruby nicht mit "Cygwin Installer" installiert ist, ist es kein Cygwin-Programm und ich sehe nicht, warum es sich um Cygwin-DLL-Loader kümmern sollte. matzeri vor 7 Jahren 0
RVM funktioniert, indem Sie Ruby aus dem Quellcode herunterladen und kompilieren. Wenn Sie es also in einer Cygwin-Umgebung ausführen, werden die Binärdateien ein "Cygwin-Programm" sein. Durch das Herabstufen von Cygwin auf 2.5.1 wurde mein Problem behoben. Ajedi32 vor 7 Jahren 0
@ Ajedi32, für den Fall, dass dies immer noch ein Problem für Sie ist, habe ich unten eine Antwort für RVM installiert. Ich wollte meine Cygwin-Version nicht wirklich downgraden! zelanix vor 7 Jahren 0
2
Michael D

Das Ruby-Paket hat Probleme beim Laden nativer Bibliotheken (mindestens kernel32.dll). Das Problem entsteht durch einen Aufruf, bei dns.getresource("_rubygems._tcp.#", Resolv::DNS::Resource::IN::SRV)dem wahrscheinlich ein systemeigener Aufruf zum kernel32.dllLaden der kernel32.dllBibliothek erfolgt.

Wenn Sie den vollständigen Pfad zur Bibliothek angeben, funktioniert sie ordnungsgemäß.

kernel = Fiddle::Handle.new("c:/Windows/System32/kernel32.dll") 

Versuchen Sie Folgendes, um das Problem zu lösen:

  1. Erfordern devkitbeim Laufen extconf.rbwie folgt: ruby -rdevkit extconf.rb, oder einfach nur das Hinzufügen require "devkit"zu extconf.rbdann in der Regel das Skript ausgeführt wird .
  2. Führen Sie das devkitvars.batSkript vom Devkit aus aus, um das PATHmit der Toolchain vor dem Kompilieren zu konfigurieren .
Ich verstehe nicht ganz, was Sie von mir wollen. Ich benutze nur "gem", keine Skripte von meiner Seite. Ich kann also keinen vollständigen Pfad angeben und weiß nicht, was die "extconf.rb" ist und wie und wann sie verwendet wird. Ich kompiliere auch nichts. Bitte geben Sie einige weitere Anweisungen, damit ich testen kann, was Sie empfohlen haben. Neon vor 7 Jahren 1
Weitere Informationen zu "extconf.rb" finden Sie hier [http://www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Extending_Ruby_Creating_a_Makefile_with_extconf.rb.html). Um das Laden von `kernel32.dll` zu überprüfen, verwenden Sie das Skript [this] (http://www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Extending_Ruby_Creating_a_Makefile_with_extconf.rb.html). Michael D vor 7 Jahren 0
Es tut mir leid, ich scheine den gleichen Link zweimal angehängt zu haben (das hier (https://sourceforge.net/p/msys2/tickets/10/attachment/unable_to_load_kernel32_testcase.rb), das Skript, über das ich im vorherigen Kommentar gesprochen habe. Michael D vor 7 Jahren 0