尝试从 C 调用 ruby 方法时如何在 C 代码中“要求”第三方模块?

问题描述 投票:0回答:1

我这里有以下代码:



#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 中?

提前感谢您的回答。

ruby libraries ruby-c-extension
1个回答
0
投票

你写的看起来确实应该有效。如果您运行此 eval,您会看到什么输出?

rb_eval_string_protect("puts $:", &state);

这应该告诉您在 eval 语句的上下文中搜索的加载路径。

这是一种更简洁的调用方式

require
,顺便说一句:

rb_require_string(rb_str_new2("strscan"));

如果加载路径在非评估上下文中不同,可能值得一试。

© www.soinside.com 2019 - 2024. All rights reserved.