После некоторых исследований я обнаружил, что сообщение об ошибке The specified module could not be found.
означает, что в программе могут отсутствовать необходимые библиотеки DLL. Теперь, когда присутствует sqlite3_native.so
, я предположил, что - это та программа, в которой отсутствуют библиотеки DLL. Запуск dumpbin
на нем дал следующие результаты:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>dumpbin /dependents C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems\sqlite3-1.4.2\lib\sqlite3\sqlite3_native.so
Microsoft (R) COFF/PE Dumper Version 14.22.27905.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems\sqlite3-1.4.2\lib\sqlite3\sqlite3_native.so
File Type: DLL
Image has the following dependencies:
x64-msvcrt-ruby260.dll
KERNEL32.dll
msvcrt.dll
libsqlite3-0.dll
...
Очевидно, libsqlite3-0.dll
никогда не обнаруживался OCRA и, следовательно, никогда не перемещался в каталог bin/
временной папки. Быстрый поиск показал, что libsqlite3-0.dll
действительно присутствует на моей машине в C:\Ruby26-x64\msys64\mingw64\bin
. Я переместил его в C:\Ruby26-x64\bin
и запустил OCRA со следующими параметрами:
ocra --dll libsqlite3-0.dll script.rb --output script.exe
Позже я понял, что OCRA теперь может самостоятельно определять эту DLL:
=== Adding ruby executable ruby.exe
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libgmp-10.dll
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libffi-6.dll
=== Adding detected DLL C:/Ruby26-x64/bin/libsqlite3-0.dll <<<< HERE!
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libgcc_s_seh-1.dll
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libwinpthread-1.dll
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/zlib1.dll
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libssl-1_1-x64.dll
=== Adding detected DLL C:/Ruby26-x64/bin/ruby_builtin_dlls/libcrypto-1_1-x64.dll
=== Adding external manifest C:/Ruby26-x64/bin/ruby_builtin_dlls/ruby_builtin_dlls.manifest
Итак, наконец:
ocra script.rb --output script.exe
Работает правильно, и нет необходимости в sqlite3.dll
.
Это, кажется, довольно универсальное решение, так как я смог запустить пуму из сценария, упакованного OCRA, добавив необходимые библиотеки DLL в папку Ruby установки bin/
.