Pada Windows 7 Professional 64 Bit yang baru diinstal saya menginstal Cygwin (64) dan beberapa paketnya, termasuk Ruby. Saya juga telah menginstal Ruby menggunakan installer Ruby, karena saya mungkin akan membutuhkannya untuk shell Windows default dan Cygwin.
Sekarang ketika saya mencoba menjalankan a gem
perintah suka gem list
atau gem install foo
, Saya mendapatkan kesalahan aneh yang gagal saya selesaikan dalam beberapa jam terakhir pencarian di 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
Namun, dengan versi Windows asli, dari Windows CMD, ia berfungsi tanpa masalah. Namun saya tidak dapat menggunakan hal-hal asli Windows Ruby dari Cygwin, karena itu memberi saya kesalahan, tapi itu bukan pertanyaannya di sini.
Dengan Process Monitor saya tahu bahwa Ruby mencoba untuk membuka C:\cygwin64\bin\kernel32.dll
dan gagal, karena file itu tidak ada. Saya mencoba menyalin kernel32.dll
dari C:\Windows\System32
dan yang dari C:\Windows\SysWOW64
ke dalam Cygwin itu bin
folder dan masih mendapat kesalahan yang sama (terlepas dari itu katanya tidak dapat memuat kernel32.dll ), meskipun Monitor Proses tidak menunjukkan a NAME NOT FOUND
kesalahan lagi.
Sihir apa yang terjadi di sini? Saya benar-benar ingin memahami apa yang salah di sini. Saya menghargai bantuan apa pun.
Cara untuk memperbaikinya tanpa mengubah proses pembuatan rvm adalah:
ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32
Ini terjadi karena ruby mencari perpustakaan bersama yang diberi nama sederhana
kernel32
. Cygwin 2.5.1 dan sebelumnya secara otomatis menambahkan ekstensi ".dll" ke beban pustaka bersama. Tapi cygwin 2.5.2 memperkenalkan tambalan yang membutuhkan nama file pustaka bersama penuh. Menambahkan tautan simbolis dalam jalur pencarian perpustakaan (/usr/lib
) memungkinkan perpustakaan ditemukan bahkan ketika dimuat dengan nama gaya lama.sumber
resolv.rb
. Bekerja dengan Cygwin 2.6.0 dan rbenvSaya menginstal ruby menggunakan rvm sehingga biner Cygwin ruby yang diperbarui tidak banyak membantu dan saya tidak benar-benar ingin menurunkan versi instalasi Cygwin saya - bagaimana saya tahu kapan aman untuk memutakhirkan lagi?
Mengikuti informasi dalam jawaban Michael D, masalahnya tampaknya ada di
resolv.rb
file terletak di~\.rvm\rubies\ruby-<version>\lib\ruby\<version>\win32
(dalam hal ini~\.rvm\rubies\ruby-2.1.7\lib\ruby\2.1.0\win32
).Di suatu tempat dekat bagian atas file ini, ada kode
Cukup mengubah
dlload "kernel32"
baris kedlload "kernel32.dll"
sepertinya memperbaikinya untuk saya. Atau menggunakan jalur lengkapjuga berfungsi, tetapi tampaknya ekstensi yang merupakan bagian penting (jalur penuh tanpa ekstensi juga tidak berfungsi).
Ini mungkin telah diperbaiki dalam versi rvm yang lebih baru, tetapi saya tidak ingin melalui kerumitan memperbarui dan menginstal ulang, jadi ini bekerja untuk saya. Atau tentu saja ini mungkin perlu diubah untuk semua rubi yang terpasang.
sumber
Paket Ruby memiliki masalah memuat pustaka asli (setidaknya kernel32.dll). Masalahnya berasal dari panggilan ke
dns.getresource("_rubygems._tcp.#{host}", Resolv::DNS::Resource::IN::SRV)
yang mungkin membuat panggilan asli kekernel32.dll
karenanya memuatkernel32.dll
Perpustakaan.Jika Anda menentukan path lengkap ke perpustakaan, itu akan berfungsi dengan benar.
Untuk mengatasi masalah ini, cobalah hal berikut:
devkit
saat berlariextconf.rb
sebagai berikut:ruby -rdevkit extconf.rb
, atau hanya menambahkanrequire "devkit"
untukextconf.rb
lalu jalankan skrip secara normal.devkitvars.bat
skrip dari devkit untuk mengkonfigurasiPATH
dengan toolchain sebelum dikompilasi.sumber
gem
, tidak ada skrip dari sisiku. Jadi saya tidak dapat menentukan path lengkap dan saya tidak tahu apa ituextconf.rb
bukan bagaimana atau kapan menggunakannya. Saya juga tidak mengkompilasi apa pun. Tolong berikan beberapa instruksi lebih lanjut sehingga saya dapat menguji apa yang Anda sarankan.extconf.rb
silakan lihat sini . Untuk memeriksa pemuatankernel32.dll
coba gunakan ini naskah.