C库周围的Ruby扩展包装器无法加载已安装的库

C库周围的Ruby扩展包装器无法加载已安装的库,c,rubygems,linker-errors,dynamic-linking,ruby-c-extension,C,Rubygems,Linker Errors,Dynamic Linking,Ruby C Extension,Ruby扩展 到C库 无法在Ubuntu和Debian上正确加载。它可以在开发机器(MacOS)上正常工作,正如smoke test Ruby项目的自述文件所示 RubyGems加载程序(通过bundler)编译并安装扩展,如下所示: ~/dvt$ rm -rf ~/.bundle ~/dvt$ bundle install Fetching gem metadata from https://rubygems.org/. Using bundler 2.0.2 Fetching davenpo

Ruby扩展 到C库 无法在Ubuntu和Debian上正确加载。它可以在开发机器(MacOS)上正常工作,正如smoke test Ruby项目的自述文件所示

RubyGems加载程序(通过bundler)编译并安装扩展,如下所示:

~/dvt$ rm -rf ~/.bundle
~/dvt$ bundle install
Fetching gem metadata from https://rubygems.org/.
Using bundler 2.0.2
Fetching davenport 1.0.2.pre
Installing davenport 1.0.2.pre with native extensions
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
~/dvt$ bundle info davenport
  * davenport (1.0.2.pre)
    Summary: Ruby binding for the Davenport library
    Homepage: https://github.com/wbreeze/davenport-ruby
    Path: /home/deploy/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0\
      /gems/davenport-1.0.2.pre
~/dvt$ ls /home/deploy/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0\
      /gems/davenport-1.0.2.pre/lib/davenport_ruby/
davenport_ruby.so
~/dvt$
但是,尝试运行该程序会产生:

deploy@localhost:~/dvt$ ruby test.rb
Traceback (most recent call last):
    6: from test.rb:1:in `<main>'
    5: from /home/deploy/.rbenv/versions/2.6.3/lib/ruby/2.6.0/rubygems\
       /core_ext/kernel_require.rb:34:in `require'
...
    1: from /home/deploy/.rbenv/versions/2.6.3/lib/ruby/2.6.0/rubygems\
       /core_ext/kernel_require.rb:54:in `require':\
  libdavenport.so.0: cannot open shared object file: No such file or\
    directory - /home/deploy/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0\
      /gems/davenport-1.0.2.pre/lib/davenport_ruby/davenport_ruby.so\
(LoadError)
Ruby davenport扩展已发布的
1.0.2.pre
版本来自于该链接,其中显示了所有的代码位(以及大量的实验)。这是一个细节还是一块不太正确的扩展宝石

达文波特·鲁比·索
.so
文件是安装gem时编译的共享库文件。《创业板》的内容中没有:

~/davenport-ruby/dltem[i1]$ gem unpack davenport-1.0.2.pre.gem
Unpacked gem: '/Users/dcl/davenport-ruby/dltem/davenport-1.0.2.pre'
~/davenport-ruby/dltem[i1]$ ls -R
davenport-1.0.2.pre davenport-1.0.2.pre.gem

./davenport-1.0.2.pre:
History.txt README.rdoc Rakefile    ext     lib

./davenport-1.0.2.pre/ext:
davenport_ruby

./davenport-1.0.2.pre/ext/davenport_ruby:
davenport_ruby.c    extconf.rb

./davenport-1.0.2.pre/lib:
davenport.rb
~/davenport-ruby/dltem[i1]$
当RubyGems安装gem时,它是否检测到
s扩展
此错误意味着本机扩展名
davenport\u ruby.so
无法加载davenport的共享库
libdavenport.so.0
。您需要使用ldconfig或通过将共享库的路径添加到
LD\u library\u path
来确保其位于加载路径中


旧的错误答案:

Ruby C扩展必须针对运行它们的平台进行编译。如果您只是下载一些使用扩展的Ruby代码,那么它将无法开箱即用

您是否使用
gem
bundle
构建扩展?你是在你试图运行脚本的Ubuntu机器上运行的吗

gem不应该包含
。因此
。当您安装gem时,它应该构建
.so
,并将其放在Ruby的加载路径中,以便脚本能够需要它

假设您实际安装了gem,并且它成功地构建了
。因此
,我可以想到两个可能的问题

  • 您使用错误的工具或选项安装了gem,因此它将
    .so
    放在了错误的位置
  • 您以错误的方式运行Ruby(您使用的是rbenv还是rvm?),因此它在错误的位置查找
    。所以

  • 运行
    gem-environment
    ruby-e'p$:'
    将gem安装目录与ruby的加载路径进行比较。

    以root用户身份运行
    ldconfig/usr/local/lib
    就是答案。它使加载程序能够在运行时找到已安装的
    libdavenport.so.0

    对于下面的问题,答案是
    makeinstall
    可能无法消除在某些系统上运行
    ldconfig
    的需要。有一个老问题是反对另一个图书馆在 . 他们没有弄明白。如果他们这样做了,他们就不会更新问题。一个新的问题 他也有类似的挣扎

    libtool
    的当前Gnu文档在其 ,

    install Makefile目标应警告软件包安装程序设置 适当的环境变量(LD_LIBRARY_PATH或等效变量),或 运行ldconfig

    本例中的“解决方案”是Davenport库的文档解决方案, 使用对自述文件进行了更新

    这里有一个关于库链接和加载的简短解释
    (这是广告支持的,但并不痛苦;这篇文章值得参考)。

    谢谢您的浏览。问题现在有一个gem内容列表,以及关于
    davenport_ruby.so
    和扩展构建的问题。gem文件是使用
    gem build davenport.gempec
    构建的。它是使用bundler和Gemfile安装的。非常感谢您提供有关验证gem安装和本机编译的提示。
    ruby-e'p$:'
    命令是一个TIL。问题底部链接的要点现在包含了这两方面的输出。它看起来像是安装、编译扩展gem,并且是由冒烟测试程序加载的扩展gem。如果gem的安装和加载看起来不错,那么问题可能出在C代码本身或者linking.Upvoted中,因为答案包含了验证构建和安装的非常好的策略。这样做排除了很多可能性。为什么C库
    libdavenport.so.0
    会调用扩展库
    davenport\u ruby.so
    (存在),而不是相反?C库在扩展中不引用任何内容,而扩展引用C库。这可能是链接的名称冲突问题吗?
    ~/davenport-ruby/dltem[i1]$ gem unpack davenport-1.0.2.pre.gem
    Unpacked gem: '/Users/dcl/davenport-ruby/dltem/davenport-1.0.2.pre'
    ~/davenport-ruby/dltem[i1]$ ls -R
    davenport-1.0.2.pre davenport-1.0.2.pre.gem
    
    ./davenport-1.0.2.pre:
    History.txt README.rdoc Rakefile    ext     lib
    
    ./davenport-1.0.2.pre/ext:
    davenport_ruby
    
    ./davenport-1.0.2.pre/ext/davenport_ruby:
    davenport_ruby.c    extconf.rb
    
    ./davenport-1.0.2.pre/lib:
    davenport.rb
    ~/davenport-ruby/dltem[i1]$
    
    ~/dvt$ bundle install
    Fetching gem metadata from https://rubygems.org/.
    Using bundler 2.0.2
    Fetching davenport 1.0.2.pre
    Installing davenport 1.0.2.pre with native extensions
    Bundle complete! 1 Gemfile dependency, 2 gems now installed.
    Use `bundle info [gemname]` to see where a bundled gem is installed.
    ~/dvt$ ldd ~/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/davenport-1.0.2.pre/lib/davenport_ruby/davenport_ruby.so
        linux-vdso.so.1 (0x00007fff2d3e3000)
        libdavenport.so.0 => not found
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9a5be42000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a5baa3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9a5c349000)
    ~/dvt$
    
    ~/dvt$ ruby test.rb
    Hola
    [1, 3, 2, 4]
    ~/dvt$
    
    libdavenport.so.0: cannot open shared object file: No such file or\
    directory - /home/deploy/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0\
      /gems/davenport-1.0.2.pre/lib/davenport_ruby/davenport_ruby.so