【问题标题】:Ruby SQLite3 OCRA executable missing sqlite_native.soRuby SQLite3 OCRA 可执行文件缺少 sqlite_native.so
【发布时间】:2020-01-27 03:19:51
【问题描述】:

我正在尝试使用 OCRA 打包以下 ruby​​ 脚本(我使用的是 Windows 10,Ruby 2.6):

require 'sqlite3'

puts SQLite3::VERSION

在 cmd 中运行它可以正常工作:

C:\Users\monday\Documents\projects\sqlite3_test>script.rb
1.4.2

当我通过以下方式打包script.rb时:

ocra --gem-full=sqlite3 --dll sqlite3.dll script.rb --output script.exe --verbose

根据 SO 和 GitHub 上的各种建议,我已将 sqlite3.dllsqlite3.def 添加到我的 PATHC:\Ruby26-x64\bin

这是我运行生成的script.exe 时弹出的错误:

C:\Users\monday\Documents\projects\sqlite3_test>script.exe
Traceback (most recent call last):
        2: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/src/script.rb:1:in `<main>'
        1: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- sqlite3 (LoadError)
        6: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/src/script.rb:1:in `<main>'
        5: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
        4: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
        3: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
        2: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3.rb:4:in `<top (required)>'
        1: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- sqlite3/2.6/sqlite3_native (LoadError)
        7: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/src/script.rb:1:in `<main>'
        6: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
        5: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
        4: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
        3: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3.rb:2:in `<top (required)>'
        2: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3.rb:6:in `rescue in <top (required)>'
        1: from C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': 126: The specified module could not be found.   - C:/Users/monday/AppData/Local/Temp/ocr7747.tmp/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/sqlite3_native.so (LoadError)

根据 OCRA 的输出判断,我确信 lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/sqlite3_native.so 存在于临时文件夹中:

...
m lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3.rb
m lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/constants.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/errors.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/pragmas.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/resultset.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/sqlite3_native.so <<< HERE!
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/statement.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/value.rb
a lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/version.rb
...

我错过了什么?

【问题讨论】:

    标签: ruby sqlite3-ruby ocra


    【解决方案1】:

    经过一番研究,我发现错误消息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
    
    ...
    

    显然,OCRA 从未检测到libsqlite3-0.dll,因此从未移动到临时文件夹的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

    这似乎是一个非常通用的解决方案,因为我可以通过将所需的 DLL 添加到 Ruby 安装的 bin/ 文件夹中来从 OCRA 打包的脚本中运行 puma。

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2014-01-22
      相关资源
      最近更新 更多