久しぶりに作業してはまったので対象方法を紹介します.
問題
困ったのは,生成した .exe を実行したときに下記のように openssl.so に関するエラーがでることです.
1 2 3 |
C:/xxx/xxx/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:83: in `require': 126: 指定されたモジュールが見つかりません。 - C:/xxx/xxx/lib/ruby/2.7.0/x64-mingw32/openssl.so (LoadError) |
エラーをみると,openssl.so が .exe に含まれていないことが原因にみえます.
しかしながら,OCRA を実行する際に –debug-extract オプションをつけて,.exe に含まれるファイルを調べてみると,ちゃんと openssl.so は組み込まれています.
解決策
この問題は,32bit 版の Ruby を使うことで解決します.
RubyInstaller のページに行くと,「Ruby x.y.z (x64)」と「Ruby x.y.z (x86)」があります.最近の PC は 64bit で,ファイルの並びとしても x64 のほうが先に来ているので 64bit な x64 の方を選んでしまいがちですが,OCRA を使いたい場合これは罠です.x86 の方を選びましょう.
x86 の方を使えば普通に ocra を事項するだけで OK です.
x64 版だと,「–dll ruby_builtin_dlls\libssp-0.dll」とを指定しないと,DLL が含まれてないとかのエラーが出ていたと思いますが,その指定も不要です.
なお.x64 版だとエラーがでるのは,openssl.so が依存しているライブラリが見つからないからだとおもうのですが,具体的に何が不足しているのかの調べ方がわからなかったので深追いできてません…
おまけ
OCRA するときにはまりやすいポイントがもう1点あるのでついでに紹介します.
スクリプトの中で HTTPS で通信する場合は,証明書を同梱しておく必要があります.具体的な手順は下記です.
- スクリプトの中で HTTP 通信をする前に,下記のコードを追加.
123if (ENV.has_key?("OCRA_EXECUTABLE"))ENV["SSL_CERT_FILE"] = File.join(File.dirname($0), "cert.pem")end - Ruby をインストールしたフォルダ以下の ssl\cert.pem をスクリプトと同じフォルダにコピー.
- OCRA を実行するときにスクリプトとともに cert.pem も指定.
1ocra script.rb cert.pem
これで,問題なく HTTPS 通信ができるようになると思います.
コメント