问题标签 [ruby-native-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
548 浏览

ruby - 使用 Crystal 的 Ruby gem 原生扩展?

我只是想收集一些一般信息,因为我希望提高 ActiveModelSerializers 的性能。

我以前也从未编写过本机扩展,但看过一些 C 扩展和 Rust 扩展。

我的问题:

  • 这已经完成了吗?(在红宝石中编写水晶原生扩展?)
  • 与红宝石物体/结构的相互作用如何在水晶中起作用?(这两种语言之间是否需要任何形式的编组或任何东西进行通信?)
0 投票
1 回答
117 浏览

ruby - 构建 ruby​​ 原生扩展的问题

我在 c 中创建了一些我想从 ruby​​ 调用的代码。我已将这篇文章用作指南,但在没有链接问题的情况下运行它时遇到了问题。

首先,我必须直接将源文件复制到我的ext/NAME/目录中。如果我将它们 git submodule 放入该目录,它们似乎不会被拾取,这意味着它们将位于某个子目录下,例如ext/NAME/CLIB_GIT_SUBMODULE_FILES/.

接下来,似乎我必须运行我的 c 项目 makefile,否则我会遇到段错误。如果我运行我的 makefile,目标文件.oext/NAME/test/

请注意,当我在ext/NAME/它下运行 makefile 时,会创建SOMEFILE_ONE.o等。

我不确定此时发生了什么 :( 指南似乎都在ext/NAME目录中编写新的 c 代码,而不是包装现有的 c 库。我尝试查看其他项目以获取指导,例如nokogiri,但他们正在做更多,这使得很难筛选。

任何帮助深表感谢!

0 投票
3 回答
945 浏览

ruby - ruby 原生扩展:未定义的符号

我正在尝试创建一个 ruby​​ 本机扩展,但是当我运行rake用于ext/example_project/extconf.rb构建我的项目并在 下运行我test/的测试时,运行测试时出现以下错误:

我很确定我的文件没有正确链接,我需要以某种方式更改我的extconf.rb和/或Rakefile,但我不确定如何。

我创建了一个简单的存储库,用于在 GitHub 上演示该问题。如果您克隆它并rake从项目根目录运行,它将失败并出现相同的错误。

一些附加信息:

  • 我使用 ruby​​ gemhoe通过创建项目sow example_project
  • 失败的函数试图调用子目录中定义的函数ext/example_project/c_example_project。我的实际项目使用ext/example_project目录中的 git 子模块,该子模块又将子模块设置为子目录。子模块是具有扁平结构的 ac 项目(根目录中的所有文件)。注意:该措辞可能令人困惑,但关键是定义了一个嵌套的 c 项目,ext/example_project/c_example_project其中包含我试图调用的方法。

让我知道是否需要任何澄清,我会尽力提供。

0 投票
0 回答
82 浏览

c++ - ruby native wrap c库segfault

我正在尝试包装一个我用 c 编写的小型库,我想我正在努力让它工作。该库围绕它进行了一些非常可靠的测试,我已经通过 valgrind 运行它以消除任何内存泄漏和明显的问题。它本身就非常可靠。

但是,当我尝试使用 ruby​​ 包装它时,它会出现段错误。这是一个包装库的示例项目。当该项目中的测试运行时,对库的调用会出现段错误。运行它会导致核心中止,我已将其加载到 gdb 中以进行调试,但我不确定出了什么问题。核心转储说问题出在这条线上,但我不知道是什么原因造成的,因为给出的信息非常稀疏,如果我在 c 中运行测试,代码运行良好。

核心转储所说的行是 segfaulting

您可以通过从根目录运行来重现它,rake该根目录会启动最终生成由测试加载的共享对象的进程。我希望在 c 方面有更多经验的人可以看看并有可能为我指明正确的方向。

如果需要更多信息,请告诉我。

来自核心转储的片段

0 投票
1 回答
119 浏览

ruby - Ruby 原生扩展 - 手动编译

我创建了新的 Ruby C 扩展并将其托管在 GitHub 中,并通过 Bundler ( gem 'my_cool_gem', git: '..') 进行安装。

但是当我运行应用程序(rails s)时,我得到一个错误 -

cannot load such file -- my_cool_gem/my_cool_gem

我目前的解决方案是手动编译它:

只有这样,我的应用程序才能工作。

有任何想法吗?

0 投票
0 回答
55 浏览

ruby - Ruby Native Extension - 使用其他 C 扩展 gem

我正在编写 ruby​​ c 扩展,它依赖于另一个 C 扩展。目前,我正在通过rb_funcall我想直接调用 C 扩展的函数来调用另一个 C 扩展(包括它的标头并调用公共函数)

这可能吗?

0 投票
0 回答
124 浏览

ruby-on-rails - 在没有开发选项的 Plesk 管理的机器上使用带有本机扩展的预编译 gem 时出错

我的目标是让生产机器运行 Ruby on Rails 应用程序。然而,这台生产机器由 Plesk 管理,只允许非常基本的访问,但承诺能够运行 Ruby on Rails 应用程序。

实际上,对于一个过于简单的示例来说,原则上它可以在 Rails 上运行 Ruby,但是运行任何需要带有本机扩展的 gem 的应用程序(例如 nokogiri,rails 默认应用程序已经需要它,由 生成rails new)已经失败。

部分日志如下所示:

我可以选择“重新启动应用程序”、“安装包”(bundle install --path vendor/bundle根据文档执行)和“添加环境变量”。

我对机器的 SSH 访问权限非常有限,但无法访问任何编译器或库。

支持人员建议我“预编译我的 gem”,但没有给出任何具体建议。我设置了一个虚拟开发机器,它有点接近生产机器,但在所有路径和例如 Linux 内核版本方面绝对不一样。我使用 gem-compiler ( https://github.com/luislavena/gem-compiler ) 进行编译,它应该可以正常工作,但预编译的 gem 位于 bundle/cache 中,并通过 Plesk 界面安装它们。

但是,该应用程序不断抛出错误。预编译的 gem(msgpack是其中之一;最初带有本机扩展)似乎以错误的方式链接?老实说,我已经不知道了。我已经尝试将我的开发机器打包libruby.so.2.4到生产机器上,这稍微减少了错误,但无助于解决它。

您对规避给定限制的明智策略有什么建议吗?我做得对吗,但根本不可能让它在这种环境中运行?

提前致谢!
罗伯特

0 投票
1 回答
38 浏览

c - 如何将用 C 编写的块传递给 Ruby 的 rb_mod_refine?

也许更一般地说,你如何将一个用 C 编写的块传递给另一个接受块的 C 函数?我知道我可以做这样的事情:

但我觉得必须有一种方法可以rb_mod_refine直接调用而不是通过rb_block_call.

有任何想法吗?谢谢!

0 投票
0 回答
32 浏览

ruby - 在构建 Ruby gem 时指定 C 和 C++ 编译器路径

gem允许指定构建参数,但是我在生成的 Makefile 中找不到构建参数来覆盖CCCXX常量mkmf(默认值似乎来自RbConfig::CONFIG)。

在构建扩展时如何指定要使用的编译器?

0 投票
0 回答
125 浏览

ruby - 尝试安装彩色 http gem 时出错

我正在尝试安装gem coloured http,但是当我运行“gem install coloured http”时出现此错误:

有人可以帮我:)吗?

提前致谢