我这里有以下代码:
#include <ruby.h>
int main(int argc, char* argv[])
{
/* construct the VM */
ruby_init();
/* Ruby goes here */
int state;
VALUE result;
result = rb_eval_string_protect("require 'strscan'", &state);
if (state)
{
/* handle exception */
VALUE exception = rb_errinfo();
rb_funcall(rb_mKernel, rb_intern("puts"), 1, exception); // Just print out the exception
}
/* destruct the VM */
return ruby_cleanup(0);
}
当我运行此代码时,出现以下错误:
cannot load such file -- strscan
eval:1:in 'Kernel#require': cannot load such file -- strscan (LoadError)
from eval:1:in '<main>'
这明显提示程序找不到该库。
我用这些命令编译了我的代码:
clang -I/home/oof/.rubies/ruby-master/include/ruby-3.4.0+0/x86_64-linux -I/home/oof/.rubies/ruby-master/include/ruby-3.4.0+0 -L/home/oof/.rubies/ruby-master/lib -lruby -lm oof.c -o binary
然后我在运行代码之前也运行了
export LD_LIBRARY_PATH=/home/oof/.rubies/ruby-master/lib/
,因为程序需要找到libruby.so
才能运行。
我根据 这些说明从源代码编译了 ruby 并将该编译版本安装到
/home/oof/.rubies/ruby-master/
如何将
strscan
(或任何第三方 ruby 代码)导入到 C-ruby 中?
提前感谢您的回答。
你写的看起来确实应该有效。如果您运行此 eval,您会看到什么输出?
rb_eval_string_protect("puts $:", &state);
这应该告诉您在 eval 语句的上下文中搜索的加载路径。
这是一种更简洁的调用方式
require
,顺便说一句:
rb_require_string(rb_str_new2("strscan"));
如果加载路径在非评估上下文中不同,可能值得一试。