问题标签 [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.
ruby - 是否可以在 ruby C 扩展中使用 rb_cIPSocket
我正在学习如何编写 Ruby C 扩展,并且我已经通过了最简单的示例。我试图用套接字来实现一些东西,所以我试图创建一个扩展,它将在rb_cIPSocket
.
在我的 C 文件的顶部,我有:
我收到:
这很可能是这种情况。但是,我尝试了所有可能的路径:
这是我的extconf.rb
:
等等。我在这里实际上错过了什么?为什么我不能包含那个头文件?我正在使用带有 RVM 和 Ruby 1.9.3-p448 的 OSX。谢谢你。
ruby - 将 C 本机方法添加到预先存在的 Ruby 类
我想知道如何将用 C 扩展编写的本机方法添加到预先存在的 Ruby 类中?我只找到了允许您创建新的 Ruby 类的函数,但没有找到返回预先存在的类的函数。
c++ - 无法完成 Rice (Ruby) 的简单示例。我错过了什么?
我正在关注http://rice.rubyforge.org/index.html上的 ruby Rice 教程。我的最终目标是能够包装一个我已经在运行的 c++ 对象,但可以从 Ruby 中调用它。
按照本教程,我可以创建一个 C++ 类并调用我定义的方法,但是,一旦我包装了一个预先存在的 C++ 对象,我就会得到一个符号查找错误:
extconf.rb:
测试.cpp
我在红宝石方面的经验很少,在赖斯方面没有。难道我做错了什么?看来我对共享库的了解还不够,无法彻底调试。如果有帮助,我会在运行ldd -d -r Test.so时得到这个
但我不明白为什么当类来自同一个文件时它是未定义的。
我错过了什么,为什么会这样?
ruby - 为什么 gem 不能自动编译我的 C 扩展
我构建了一个 Ruby gem,它需要一些 C 扩展。这个 - 一旦编译 - 通过 Ruby FFI 绑定到 gem 中。
我的设置:我使用 bundle 作为 gem 脚手架。在我的 gems 文件夹中,我有一个子文件夹ext
。这包括一个静态 Makefile、另一个子文件夹source
和一个 extconf.rb。
该source
文件夹包含所有 .c 和 .h 文件。
Makefile 不必动态创建。如果我调用所有编译make clean && make
,ext
并且 gem 按预期工作。
现在我给 extconf.rb 以下内容:
所以我让 mkmf 先创建一个 Makefile,然后用我的静态模板覆盖它。愚蠢的。
当我现在通过构建我的 gemrake build
并尝试在另一台机器上安装它时,扩展名没有被编译。
谁能告诉我,为了让扩展在安装时自动编译,我必须做什么?
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 版本 2.0.0-p247,我刚刚切换回 1.9.3-p362,现在一切正常。
编辑2:
解决了,有点。我必须使用配置选项 --enable-shared 集重建 ruby 1.9.3-p362。通过 rvm 这将是:
c++ - Ruby C 扩展中的 C++,指针问题
我正在尝试构建一个使用一些 c++ 库的 Ruby C 扩展。问题是我什至无法让一个简单的“hello world”工作。
我得到的输出是
我不是 C/C++ 专家。Ruby 是我的语言。我在下面编译了几千行 C++我已经在Rice下毫无问题
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 时,我得到以下输出。把它放在当前的工作目录中可以解决这个问题。
ruby-on-rails - 如何将 Ruby C 扩展添加到 Rails 应用程序中?
我有 Rails 4 应用程序。我创建了简单的 C 扩展,Ruby C API
这个扩展从data
文件夹转换文件并返回基于该文件的输出(some_file.f
)
现在,当我想使用该扩展时,我需要在my_ext
dir中运行以下命令
然后我有额外的.o
.bundle
编译文件。我还创建了初始化程序require 'my_ext/my_ext'
我应该将这些文件移到哪里?进
lib/my_ext
?有没有办法改进编译过程并更好地组织编译文件?将来我还想添加测试并在扩展编译后运行它们。也许我应该从那个扩展创建一个 gem?还是耙任务?
我阅读了http://tenderlovemaking.com/2009/12/18/writing-ruby-c-extensions-part-1.html本教程,但是如何在 Rails 应用程序中实现它?将 Rakefile 放在哪里?
c - Ruby C 扩展与 Spawn Exectuable 通过#system
我有一些与 C 应用程序交互的 Ruby 代码。现在,每次需要将数据传递给应用程序时,它都会使用Kernel#system方法生成可执行文件。与创建 Ruby C 扩展相比,这种方法在系统方面有哪些优点/缺点。
c - C 扩展中的 Ruby 关键字参数
如何处理来自 C 扩展的 Ruby 2.0.0 关键字参数?
背景
在处理具有许多不同调用序列或选项的方法时,关键字参数(如上)非常有用。我在 C 扩展中有一个这样的方法(一种blit
处理我项目中大部分 OpenGL 绘图的方法),我想知道如何让该方法处理来自 ruby 的关键字参数。
想法
根据我所做的一些研究,我认为这种处理可以通过C 函数:
上的选项来完成。rb_scan_args
但是,我一直无法找到有关如何使用它的任何信息。