在C和exntend中嵌入Ruby
Embed Ruby in C and exntend
我有一个需求,需要在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);
....
}
myRubyfile.rb
require "myMod"
def helloworld()
puts "Hello world"
#puts "Sum of.. " + myMod.sum(4, 5)
end
问题是,如果我不使用require"myMod",代码就会工作并打印"Hello World",但如果我使用require。。,代码转储。
这是我的需求,我需要将ruby脚本嵌入到C中,并在ruby(扩展)中重用一些C方法。
有人能帮我吗?
您得到的是segfault,因为Ruby VM在出现未捕获的异常时会出现segfault。您需要使用类似rb_rescue
或rb_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
这样的东西应该可以工作。为您的ruby脚本文件制作一个bat脚本,并将系统更改为适当的系统调用。不确定system()是否在Windows中工作。我已经用这种方式运行了许多bash脚本,所以我认为你可以在Windows中做同样的事情。
#include <stdio.h>
#include <stdlib.h>
int main()
{
puts("Starting now:");
system("/path_to_script/script_name");
return 0;
}
相关文章:
- 递归列出所有目录中的C++与Python与Ruby的性能
- 按原样保存用户输入 - Ruby on Rails
- 与其他语言相比的 Ruby 和指针
- 它可能的 C++ 正则表达式评估器与 Lambda 像 Ruby 一样?
- 在C 程序上嵌入Ruby源的错误
- 用 rice/ruby 包裹的纯虚拟 C++ 类在运行时引发 TypeError ( "is not a class (Module)" )
- 如何在 Ruby-C++ 扩展C++类中编写非静态方法
- 如何使用 Ruby 的 Enumerable .map 方法在 C++ 中执行类似于 map 的操作
- 访问用 OCaml 编写的库,并从 Ruby 代码C++
- 通过Swig从Ruby调用C 功能
- Ruby中的多维阵列,例如C
- 在 C++ 和 Ruby 中的进程之间交换信息
- 如果用户在Ruby with Rice中重新定义initialize(),则避免C++代码中的Segfault
- 在 Ruby 和 C++ 之间交换数据
- 有没有一个很好的通用方法来用ruby包装swig生成的类
- 使用Swig将std::set转换为ruby
- 在C中创建Ruby扩展时出错
- Ruby和C++中的左移16位
- make在swig-create-ruby包装器上失败
- 在C和exntend中嵌入Ruby