Neo*_*nit 6 windows-7 cygwin ruby gem
在新安装的 Windows 7 Professional 64 位上,我安装了 Cygwin (64) 及其一些软件包,包括 Ruby。我还使用 Ruby 安装程序安装了 Ruby,因为对于默认的 Windows shell 和 Cygwin,我可能都需要它。
现在,当我尝试执行gem类似gem listor的命令时gem install foo,出现了一个奇怪的错误,我在搜索互联网的最后几个小时内未能解决。
$ 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
Run Code Online (Sandbox Code Playgroud)
但是,使用 Windows CMD 的本机 Windows 版本,它可以正常工作。然而,我不能使用来自 Cygwin 的本地 Windows Ruby 东西,因为这会给我带来错误,但这无论如何都不是问题。
使用进程监视器,我发现 Ruby 尝试打开C:\cygwin64\bin\kernel32.dll并失败,因为该文件不存在。我尝试将kernel32.dllfromC:\Windows\System32和 from复制C:\Windows\SysWOW64到那个 Cygwinbin文件夹中,但仍然得到相同的错误(除此之外,它说无法加载 kernel32.dll),尽管进程监视器不再显示NAME NOT FOUND错误。
这里正在发生什么魔法?我真的很想了解这里出了什么问题。我很感激任何帮助。
小智 6
在不更改 rvm 构建过程的情况下解决此问题的方法是:
ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32
发生这种情况是因为 ruby 正在寻找一个名为 simple 的共享库kernel32。Cygwin 2.5.1 及更早版本自动将“.dll”扩展名添加到共享库加载中。但是 cygwin 2.5.2 引入了一个需要完整共享库文件名的补丁。在库搜索路径 ( /usr/lib) 中添加符号链接允许在加载旧式名称时找到库。
我使用 rvm 安装了 ruby,因此更新的 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
Run Code Online (Sandbox Code Playgroud)
只需将dlload "kernel32"线路更改为dlload "kernel32.dll"似乎就可以为我解决问题。或者使用完整路径
dlload "c:/Windows/System32/kernel32.dll"
Run Code Online (Sandbox Code Playgroud)
也有效,但扩展似乎是关键位(没有扩展的完整路径也不起作用)。
这可能已在最新版本的 rvm 中修复,但我不想经历更新和重新安装的麻烦,所以这对我有用。当然,这可能需要对所有已安装的红宝石进行更改。
cygwin 2.5.2 发布似乎是一个意想不到的结果
https://www.cygwin.com/ml/cygwin/2016-06/msg00378.html
作为解决方法,将 cygwin 软件包降级到 2.5.1
| 归档时间: |
|
| 查看次数: |
2677 次 |
| 最近记录: |