You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用Ruby方法的C代码中引入第三方Ruby模块?

问题描述

我编写了如下嵌入Ruby的C代码:

#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/的。请问如何在C代码中正确引入strscan(或其他Ruby标准库/第三方代码)?


解决方法
  • 初始化Ruby加载路径
    你的代码仅调用了ruby_init(),未初始化Ruby的默认加载路径,导致VM无法定位标准库。在ruby_init()之后添加ruby_init_loadpath()即可:

    int main(int argc, char* argv[])
    {
        ruby_init();
        ruby_init_loadpath(); // 新增此行,初始化默认加载路径
    
        // 后续代码保持不变
    }
    

    该函数会自动将Ruby安装目录下的标准库路径(如lib/ruby/site_ruby、lib/ruby/vendor_ruby等)加入$LOAD_PATH,让require 'strscan'能找到对应库文件。

  • 手动指定加载路径(可选)
    若ruby_init_loadpath()不生效,或需加载自定义路径下的Ruby库,可手动修改$LOAD_PATH。例如在调用require前执行以下代码:

    int state;
    // 添加标准库所在路径,替换为实际路径
    rb_eval_string_protect("$LOAD_PATH.unshift('/home/oof/.rubies/ruby-master/lib/ruby/3.4.0')", &state);
    
  • 用ruby-config简化编译参数
    编译时可借助ruby-config工具自动获取当前Ruby版本的正确编译参数,避免手动指定路径出错:

    clang oof.c -o binary $(ruby-config --cflags --libs)
    
  • 检查strscan库是否存在
    确认Ruby安装目录下存在strscan库:

    ls /home/oof/.rubies/ruby-master/lib/ruby/3.4.0/strscan.rb
    

    若不存在,说明编译Ruby时未安装完整标准库,需重新编译并确保启用所有默认组件。


内容的提问来源于stack exchange,提问作者Some nerd who does not have a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:30:12