C库周围的Ruby扩展包装器无法加载已安装的库
Ruby扩展 到C库 无法在Ubuntu和Debian上正确加载。它可以在开发机器(MacOS)上正常工作,正如smoke test Ruby项目的自述文件所示 RubyGems加载程序(通过bundler)编译并安装扩展,如下所示: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
~/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