新しくインストールしたWindows7 Professional 64ビットに、Cygwin(64)とRubyを含むそのパッケージの一部をインストールしました。また、デフォルトのWindowsシェルとCygwinの両方で必要になる可能性があるため、Rubyインストーラーを使用してRubyをインストールしました。
gem list
やgem install foo
のようなgem
コマンドを実行しようとすると、インターネットを検索してから数時間以内に解決できなかった奇妙なエラーが発生します。
$ 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
ただし、Windows CMDのネイティブWindowsバージョンでは、問題なく動作します。ただし、CygwinのネイティブWindows Rubyのものはエラーが発生するため、使用できませんが、とにかくここでの質問ではありません。
Process Monitorを使用して、RubyはC:\cygwin64\bin\kernel32.dll
を開こうとしましたが、そのファイルがないため失敗しました。kernel32.dll
からC:\Windows\System32
をコピーしてみました。 C:\Windows\SysWOW64
からそのCygwinbin
フォルダーにあるものでも、同じエラーが発生します(それ以外は、kernel32.dllをロードできません)。プロセスモニターにNAME NOT FOUND
エラーが表示されなくなりました。
ここでどんな魔法が起こっているのですか?ここで何が悪いのか本当に理解したいです。私はどんな助けにも感謝します。
Cygwin2.5.2リリースの予期しない結果のようです
https://www.cygwin.com/ml/cygwin/2016-06/msg00378.html
回避策として、cygwinパッケージを2.5.1にダウングレードします
Rvmビルドプロセスを変更せずにこれを修正する方法は次のとおりです。
ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32
これは、Rubyが単にkernel32
という名前の共有ライブラリを探しているためです。Cygwin2.5.1以前では、共有ライブラリのロードに「.dll」拡張子が自動的に追加されていました。ただし、cygwin2.5。 2は、完全な共有ライブラリファイル名を必要とするパッチを導入しました。ライブラリ検索パス(/usr/lib
)内にシンボリックリンクを追加すると、古いスタイルの名前でロードされた場合でもライブラリを見つけることができます。
Ruby rvmを使用してインストールしたので、更新されたCygwin Rubyバイナリはあまり役に立たず、Cygwinインストールをダウングレードしたくありませんでした-どうすればよいですか?いつ再アップグレードしても安全だったか知っていますか?
Michael Dの回答の情報に従うと、問題はresolv.rb
(私の場合は~\.rvm\rubies\Ruby-<version>\lib\Ruby\<version>\win32
)にある~\.rvm\rubies\Ruby-2.1.7\lib\Ruby\2.1.0\win32
ファイルにあるようです。
このファイルの先頭近くにコードがあります
module Kernel32
extend Importer
dlload "kernel32"
end
dlload "kernel32"
行をdlload "kernel32.dll"
に変更するだけで、修正されたようです。または、フルパスを使用します
dlload "c:/Windows/System32/kernel32.dll"
も機能しましたが、重要なのは拡張機能のようです(拡張機能のないフルパスも機能しません)。
これは、より新しいバージョンのrvmで修正されている可能性がありますが、更新と再インストールの手間をかけたくなかったので、これで問題ありません。またはもちろん、これはインストールされているすべてのルビーに対して変更する必要があるでしょう。
Rubyパッケージにネイティブライブラリ(少なくともkernel32.dll)の読み込みに問題があります。問題はdns.getresource("_rubygems._tcp.#{Host}", Resolv::DNS::Resource::IN::SRV)
の呼び出しに起因し、おそらくkernel32.dll
のネイティブ呼び出しを行うため、 kernel32.dll
ライブラリ。
ライブラリへのフルパスを指定すると、正しく機能します。
kernel = Fiddle::Handle.new("c:/Windows/System32/kernel32.dll")
この問題を解決するには、次のことを試してください。
extconf.rb
を次のように実行する場合はdevkit
を要求します:Ruby -rdevkit extconf.rb
、またはrequire "devkit"
をextconf.rb
に追加してから、スクリプトを通常どおり実行します。devkitvars.bat
スクリプトを実行して、ツールチェーンでPATH
を構成します。