关于Ruby和链接到库的非常低级别的问题

时间:2009-08-25 15:26:58

标签: windows ruby linker low-level

我碰巧在沙盒Ruby环境中工作,并且一直在尝试使用混合结果向其中添加库。但是,它提出了一些关于Ruby如何工作的有趣问题。我想了解Ruby如何链接库以及它如何决定在启动时加载什么。

当我做

时发生了什么
require 'someLib/someClass'

之前我需要.rb文件但是libs的行为不同。 如果需要像

这样的目录,需要如何工作
require 'DL'

如何知道要加载的文件以及在解释器中注册的名称“DL”是什么?

P.S。:我现在必须使用的Ruby中唯一暴露的部分是'msvcrt-ruby18.dll'

2 个答案:

答案 0 :(得分:3)

当您require 'something' Ruby根据您的平台搜索名为something.rbsomething.dll/so/bundle的文件时。

如果找到库dll/so/bundle,它会动态加载它并搜索名为Init_something的符号。创建本机扩展时的惯例是包含一个由ruby解释器用来连接的函数。

intrepeter在哪里(在哪些目录中)查找rb文件和libs由加载路径确定,您可以使用解释器的-I选项附加加载路径。在运行时,当前的加载路径在$:中(您可以在运行时向其追加更多目录),例如:

$ irb
irb(main):001:0> puts $:
/opt/local/lib/ruby/site_ruby/1.8
/opt/local/lib/ruby/site_ruby/1.8/i686-darwin9
/opt/local/lib/ruby/site_ruby
/opt/local/lib/ruby/vendor_ruby/1.8
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9
/opt/local/lib/ruby/vendor_ruby
/opt/local/lib/ruby/1.8
/opt/local/lib/ruby/1.8/i686-darwin9
.

查看require(http://ruby-doc.org/core-1.8.7/classes/Kernel.html#M001077

的文档

我不确定你的意思:

  

P.S。 Ruby I中唯一暴露的部分   现在必须与之合作   'MSVCRT-ruby18.dll'

你还提到了一些关于沙盒的事情。这可能会影响您需要模块的能力。搜索$ SAFE,如果$ SAFE设置为> 2,您根本无法使用require

答案 1 :(得分:0)

Ruby使用内置的全局$:(美元冒号),它是一个字符串数组,指定loadrequire使用的目录集。

当你require 'DL'时,Ruby将搜索$:,其中(至少在我的机器上,我通常在任何地方都期望)包括"c:/ruby/lib/ruby/1.8/i386-mswin32",这是安装Ruby的地方在这台PC上的c:/ruby中)我找到dl.so,这是包含DL功能的编译库。