每当我尝试使用 Ruby 的 C API(带有 rb_require)来使用 gem 时,我都会收到“无法加载此类文件 --”错误,除非我使用完整路径。需要 gem 在常规 ruby 脚本中工作得很好。这些是我还需要做的吗?这些 gem 是使用 Bundler 安装的。
最佳答案
当您从扩展调用 rb_require
时,您正在调用 Ruby 中请求文件的核心“内置”进程。这会绕过 Rubygems 在替换 Kernel#require
方法时添加的 Gem 处理代码。
为了获得正确的 gem 处理,您需要调用普通的 require
方法,并让常用的方法调度将调用路由到 Rubygems 代码。您可以通过以下方式做到这一点:
rb_funcall(rb_cObject, rb_intern("require"), 1, rb_str_new_cstr("the_gem"));
如果需要,您可以调用 rb_intern
一次并存储结果,以避免多次调用。
关于除非我使用完整路径,否则无法在 Ruby C 扩展中使用 Gems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45256926/