问题标签 [ruby-c-extension]

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 投票
1 回答
49 浏览

ruby - 是否可以在 ruby​​ C 扩展中使用 rb_cIPSocket

我正在学习如何编写 Ruby C 扩展,并且我已经通过了最简单的示例。我试图用套接字来实现一些东西,所以我试图创建一个扩展,它将在rb_cIPSocket.

在我的 C 文件的顶部,我有:

我收到:

这很可能是这种情况。但是,我尝试了所有可能的路径:

这是我的extconf.rb

等等。我在这里实际上错过了什么?为什么我不能包含那个头文件?我正在使用带有 RVM 和 Ruby 1.9.3-p448 的 OSX。谢谢你。

0 投票
1 回答
540 浏览

ruby - 将 C 本机方法添加到预先存在的 Ruby 类

我想知道如何将用 C 扩展编写的本机方法添加到预先存在的 Ruby 类中?我只找到了允许您创建新的 Ruby 类的函数,但没有找到返回预先存在的类的函数。

0 投票
1 回答
645 浏览

c++ - 无法完成 Rice (Ruby) 的简单示例。我错过了什么?

我正在关注http://rice.rubyforge.org/index.html上的 ruby​​ Rice 教程。我的最终目标是能够包装一个我已经在运行的 c++ 对象,但可以从 Ruby 中调用它。

按照本教程,我可以创建一个 C++ 类并调用我定义的方法,但是,一旦我包装了一个预先存在的 C++ 对象,我就会得到一个符号查找错误:

extconf.rb:

测试.cpp

我在红宝石方面的经验很少,在赖斯方面没有。难道我做错了什么?看来我对共享库的了解还不够,无法彻底调试。如果有帮助,我会在运行ldd -d -r Test.so时得到这个

但我不明白为什么当类来自同一个文件时它是未定义的。

我错过了什么,为什么会这样?

0 投票
1 回答
338 浏览

ruby - 为什么 gem 不能自动编译我的 C 扩展

我构建了一个 Ruby gem,它需要一些 C 扩展。这个 - 一旦编译 - 通过 Ruby FFI 绑定到 gem 中。

我的设置:我使用 bundle 作为 gem 脚手架。在我的 gems 文件夹中,我有一个子文件夹ext。这包括一个静态 Makefile、另一个子文件夹source和一个 extconf.rb。

source文件夹包含所有 .c 和 .h 文件。

Makefile 不必动态创建。如果我调用所有编译make clean && makeext并且 gem 按预期工作。

现在我给 extconf.rb 以下内容:

所以我让 mkmf 先创建一个 Makefile,然后用我的静态模板覆盖它。愚蠢的。

当我现在通过构建我的 gemrake build并尝试在另一台机器上安装它时,扩展名没有被编译。

谁能告诉我,为了让扩展在安装时自动编译,我必须做什么?

0 投票
0 回答
768 浏览

c++ - 在 Ubuntu 12.04 上使用 Rice (Ruby) 查找 opencv 共享库时出错

我正在尝试将 OpenCV 共享库正确链接到 ruby​​ c++ 扩展,并且由于某种原因,对 opencv 库的 have_library() 的任何调用都失败了。我将opencv安装到/usr/local,所以头文件都在/usr/local/include中,库都在/usr/local/lib中。我将在下面附上我的 extconf.rb 和相关输出。

运行 $ ruby​​ extconf.rb 输出以下错误,表示找不到 opencv_core 的共享库。我还自己尝试了其他库,但它们也都失败了。

mkmf.log 开头包含以下内容:

g++ 命令似乎表明它正在正确地查找 /usr/local/include 中的标头,并且它也正确地从标志中查找 /usr/local/lib 中的库:

但由于某种原因,它似乎找不到任何库。

真正奇怪的是,两天前我在一个不同的 ubuntu 实例(也是 12.04)上构建了所​​有东西(使用相同版本的 opencv)并且一切正常。

我在stackoverflow上看了一会儿,发现了这个,这似乎是一个类似的问题,除了他在NetBSD上并且我正在运行Ubuntu。

如何让 Ruby 找到原生库?

不幸的是,似乎没有人确认他的问题的解决方案。

任何帮助将不胜感激,谢谢。


编辑:

嗯,我使用的是 ruby​​ 版本 2.0.0-p247,我刚刚切换回 1.9.3-p362,现在一切正常。


编辑2:

解决了,有点。我必须使用配置选项 --enable-shared 集重建 ruby​​ 1.9.3-p362。通过 rvm 这将是:

0 投票
1 回答
504 浏览

c++ - Ruby C 扩展中的 C++,指针问题

我正在尝试构建一个使用一些 c++ 库的 Ruby C 扩展。问题是我什至无法让一个简单的“hello world”工作。

我得到的输出是

我不是 C/C++ 专家。Ruby 是我的语言。我在下面编译了几千行 C++我已经在Rice下毫无问题

0 投票
0 回答
831 浏览

ruby - Ruby C 扩展依赖项

问题

我对动态库和静态库的区别有一个直观的理解。也就是说,我正在尝试编写一个使用第三方库的 C 扩展。我已经静态和动态地编译了这个库,并在我的 extconf.rb 中引用了静态库。为了清楚...

A = 3rd 方动态库(理论上未使用)
B = 3rd 方静态库(在 extconf.rb 中引用)
C = Ruby C 扩展

事情是这样的:当我在我的 ruby​​ 代码中需要 C 时,我得到一个错误。如果 A 在当前工作目录中,则不会引发此错误。奇怪。在当前工作目录中有 B 似乎使 ruby​​ 感到困惑,它找不到 A。

理想情况下,我希望系统上根本不存在 B。我想把它全部隐藏在 C 中。这就是我认为静态库所做的。这是可能的吗?如果可以,它是如何完成的?

上下文集

Windows7、Ruby2.0、DevKit、MinGW。第 3 方库是CGAL,它又依赖于 boost、mpfr 和 gmp。该扩展旨在与 SketchUp 的 ruby​​ API 一起使用。SketchUp ruby​​ 扩展通过 SketchUp 界面安装,该界面只是将相关文件复制到它选择的目录并加载它们。我的 extconf 如下所示:

要求()失败

当找不到 libCGAL.dll 时,我得到以下输出。把它放在当前的工作目录中可以解决这个问题。

0 投票
1 回答
768 浏览

ruby-on-rails - 如何将 Ruby C 扩展添加到 Rails 应用程序中?

我有 Rails 4 应用程序。我创建了简单的 C 扩展,Ruby C API 这个扩展从data文件夹转换文件并返回基于该文件的输出(some_file.f

现在,当我想使用该扩展时,我需要在my_extdir中运行以下命令

然后我有额外的.o .bundle编译文件。我还创建了初始化程序require 'my_ext/my_ext'

  1. 我应该将这些文件移到哪里?进lib/my_ext

  2. 有没有办法改进编译过程并更好地组织编译文件?将来我还想添加测试并在扩展编译后运行它们。也许我应该从那个扩展创建一个 gem?还是耙任务?

  3. 我阅读了http://tenderlovemaking.com/2009/12/18/writing-ruby-c-extensions-part-1.html本教程,但是如何在 Rails 应用程序中实现它?将 Rakefile 放在哪里?

0 投票
1 回答
94 浏览

c - Ruby C 扩展与 Spawn Exectuable 通过#system

我有一些与 C 应用程序交互的 Ruby 代码。现在,每次需要将数据传递给应用程序时,它都会使用Kernel#system方法生成可执行文件。与创建 Ruby C 扩展相比,这种方法在系统方面有哪些优点/缺点。

0 投票
1 回答
447 浏览

c - C 扩展中的 Ruby 关键字参数

如何处理来自 C 扩展的 Ruby 2.0.0 关键字参数?

背景

在处理具有许多不同调用序列或选项的方法时,关键字参数(如上)非常有用。我在 C 扩展中有一个这样的方法(一种blit处理我项目中大部分 OpenGL 绘图的方法),我想知道如何让该方法处理来自 ruby​​ 的关键字参数。

想法

根据我所做的一些研究,我认为这种处理可以通过C 函数:上的选项来完成。rb_scan_args但是,我一直无法找到有关如何使用它的任何信息。