【问题标题】:Ruby interpreter embed in C code嵌入 C 代码的 Ruby 解释器
【发布时间】:2012-03-26 00:18:09
【问题描述】:

我只是尝试了书中的一个简单示例: 我有一个 sum.rb 文件:

class Summer
  def sum(max)
  raise "Invalid maximum #{max}" if max < 0
  (max*max + max)/2
  end
end

还有一个 embed_sum.c 文件:

#include <stdio.h>
#include <ruby/ruby.h>
int main ( int argc, char ** argv) 
{
  VALUE result;
  ruby_sysinit(&argc, &argv);
  RUBY_INIT_STACK;
  ruby_init();
  ruby_init_loadpath();
  rb_require("sum");
  rb_eval_string("$summer = Summer.new");
  rb_eval_string("$result = $summer.sum(10)");
  result = rb_gv_get("result");
  printf("Result = %d\n", NUM2INT(result));
  return ruby_cleanup(0);
}

我编译它:

gcc -Wall -lruby -I/usr/include/ruby-1.9.1/  embed_sum.c -o embed_sum

当我启动 ./embed_sum 时,它会从第一个 rb_eval_string 给我一个分段错误。 我的 ruby​​ 版本是:Archlinux 上的 ruby​​ 1.9.3p125(2012-02-16 修订版 34643)[x86_64-linux]。

这个例子有什么问题?

【问题讨论】:

  • 我收到/usr/include/ruby-1.9.1/ruby/ruby.h:24:25: fatal error: ruby/config.h: No such file or directory compilation terminated.
  • @Tass 我迟到了一年,但是对于那些遇到同样问题的人,您需要在包含路径中添加/usr/include/ruby/&lt;your-architecture&gt; 或类似内容才能找到 config.h。一个简单的find /usr/include -name config.h 就会找到正确的路径。

标签: c ruby embed


【解决方案1】:

对您的问题的简短回答是将行 rb_require("sum"); 更改为 rb_require("./sum");。这是 Ruby 1.9.2 中引入的更改,当前目录不再位于加载路径上。

更普遍的问题是嵌入式 Ruby 处理异常的方式。 Pickaxe 书(我认为这是您正在使用的书,它使用了类似的示例)有这样的说法:

如果 Ruby 代码引发异常但未被捕获,您的 C 程序将终止。为了克服这个问题,您需要做解释器所做的事情并保护所有可能引发异常的调用。这可能会变得一团糟。

您需要考虑使用rb_protect 函数来包装对可能导致异常的Ruby 调用。 Pickaxe 书中有一个例子。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多