gpt4 book ai didi

c++ - 在 C 中嵌入 Ruby 并扩展

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:54 24 4
gpt4 key购买 nike

我有一个要求,需要在 C++ 中嵌入 Ruby 代码(我可以实现)并扩展一些功能。当我尝试调用(要求)我的扩展模块时,程序失败。

我已经粘贴了下面的代码:

main.cpp

#include <ruby.h>

static VALUE Sum(VALUE rb_self, VALUE rb_param1, VALUE rb_param2)
{
double val1 = NUM2DBL(rb_param1);
double val2 = NUM2DBL(rb_param2);
return rb_float_new(val1+val2);
}

void Init_myMod()
{
myMod = rb_define_module("myMod");
rb_define_module_function(myMod, "Sum", Sum, 2);
}

int main()
{
... Init ruby method...

rb_require("myRubyfile");
Init_myMod(); // This is where I need to push my ruby extension.
rb_funcall(rb_mKernel, rb_intern("helloworld"), 0 , NULL);
....
}

我的Ruby文件.rb

require "myMod"

def helloworld()
puts "Hello world"
#puts "Sum of.. " + myMod.sum(4, 5)
end

问题是如果我不使用 require "myMod"代码工作并打印 "Hello World",但是如果我使用 require..,代码转储。

这是我的要求,我需要在 C 中嵌入 ruby​​ 脚本,并在 ruby​​(扩展)中重用一些 C 方法。

有人可以帮我解决这个问题吗?

最佳答案

您遇到段错误是因为当存在未捕获的异常时 Ruby VM 会发生段错误。您需要使用 rb_rescuerb_protect 来包装可能引发异常的代码。

require "myMod" 引发异常,因为 require 仅用于加载文件。您不需要要求任何东西,因为您是直接在 VM 的内存中创建模块。那么...为什么会出错?好吧,如果你用 Ruby 编写模块,你会遇到语法错误:

module myMod
...
end
# SyntaxError: class/module name must be CONSTANT

但是当您使用 rb_define_module 时,Ruby 并没有引发异常,而是做了一件棘手的事情:它创建了模块但不将其暴露给 Ruby 代码。为了将模块暴露给 Ruby,只需使名称有效:

// .cpp
rb_define_module("MyMod");

# .rb
puts "Sum of.. " + MyMod.Sum(4, 5).to_s

关于c++ - 在 C 中嵌入 Ruby 并扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com