Windows の Ruby の fiddle で lib○○.dll が読み込めない時、何をチェックすればよいでしょうか?
こんばんは。質問させてください。
グラフ作成ライブラリGRのバインディングをRubyで作成しております。Ruby標準のfiddleというライブラリを使っており、LinuxとMacでは動作します。
ところが、WindowsでDLLファイルを読み込んでくれません。具体的には、
require 'fiddle/import'
module M
extend extend Fiddle::Importer
dlload File.expand_path('gr/bin/libGR.dll').gsub("/", "\\")
end
を実行すると、下記のようなエラーが発生します。
Traceback (most recent call last):
7: from hoge.rb:3:in `<main>'
6: from hoge.rb:5:in `<module:M>'
5: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `dlload'
4: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `collect'
3: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:87:in `block in dlload'
2: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `dlopen'
1: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `new'
C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb:47:in `initialize': No such file or directory (Fiddle::DLError)
5: from hoge.rb:3:in `<main>'
4: from hoge.rb:5:in `<module:M>'
3: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `dlload'
2: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:77:in `collect'
1: from C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:86:in `block in dlload'
C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/import.rb:89:in `rescue in block in dlload': can't load C:\Users\kojix2\(中略)gr\bin\libgr.dll (Fiddle::DLError)
全く同じようなコードでruby-ffiを使用する場合はとくに問題なく読み込みます。
require 'ffi'
module M
extend FFI::Library
ffi_lib File.expand_path('gr/bin/libGR.dll').gsub("/", "\\")
end
環境
* Windows10
* Ruby 2.6.5 (Rubyinstaller) + DevKit
他のDLLファイルを使って、私のWindows + Ruby環境でfiddleで読み込めるDLLファイルが存在することは確認しています。ひょっとするとlibGR.dll固有の問題もあるかもしれません。
WindowsとFiddleを組み合わせた情報が少なくC言語の知識もないため、何をすればよいのかわからず困っています。推測・憶測・断片的な情報でかまいませんので、どのような順番で何をチェックしていけばよいか教えてくださると助かります。
よろしくお願いします。