如何在调用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

