问题标签 [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 回答
1549 浏览

ruby - “资源”- ruby​​ gem 的目录

我目前正在尝试在 Ruby 中创建自己的 gem。gem 需要一些静态资源(比如 ICO 格式的图标)。我应该将这些资源放在我的 gem 目录树中的什么位置,以及如何从代码中访问它们?

此外,我的扩展部分是本机 C 代码,我希望 C 部分也可以访问资源。

0 投票
1 回答
1062 浏览

ruby - 如何 rb_protect ruby​​ 中的所有内容

我想从我自己的 C 代码中调用 ruby​​ 代码。万一出现异常,我必须 rb_protect 我调用的 ruby​​ 代码。rb_protect 看起来像这样:

所以proc必须是一个接受VALUE参数并返回的函数VALUE。我必须调用很多不能以这种方式工作的函数。我怎样才能让rb_protect他们免于引发异常?

我曾想过使用Data_Make_Struct将所有内容包装到一个 ruby​​ 对象中并在其上调用方法。Data_Make_Struct本身可能引发异常。我该怎么做rb_protect Data_Make_Struct

0 投票
1 回答
865 浏览

c++ - 无法创建 C++ Ruby 扩展

我在创建 ruby​​ 扩展以导出我在 OSX 下写入 ruby​​ 的 C++ 库时遇到问题。这个简单的例子:

导致抛出 bad_cast 异常:

我编译扩展:

最后将动态库与:

我在网上搜索并尝试了各种链接和编译器开关。如果我构建一个可执行文件就没有这样的问题。有没有其他人遇到过这样的问题并找到了解决方案?

我对此进行了进一步调查,发现导致异常的函数如下所示:

在 std::collat​​e<> 的源代码中,我找到了 throw 语句:

这对你有意义吗?

更新:我试过 Jan 的建议:

版本:

更新:

抛出的不是 use_facet() 中的边界检查,而是下一行,它实际上进行了动态转换。这个例子可以归结为 RTTI 的一些东西:

我使用了 printf() 因为 cout 的使用也失败了。上面代码的输出是:

构建:

更新:

如果我将 Init_bayeux 重命名为 main() 并将其链接到可执行文件,则输出是相同的,但没有调用终止。

更新:

当我编写一个小程序来加载共享库并执行 Init_bayeux() 时,再次没有抛出异常:

所以在我看来,ruby.exe 的构建方式可能存在问题。那有意义吗?

更新:我查看了包含两个 type_info 对象名称的地址。内容相同,但地址不同。我将 -flat_namespace 开关添加到链接命令中。现在 dynamic_cast 工作。boost regex 库的原始问题仍然存在,但我认为这可以通过将 boost 静态链接到共享库或使用 -flat_namespace 开关重建 boost 库来解决。

更新:现在我回到第一个带有 boost 正则表达式的示例,使用以下命令构建:

但是当将扩展加载到 ruby​​ 解释器中时,静态符号的初始化失败:

同样,当我从上面的小 c 程序加载共享库时,这不会失败。

更新:现在我链接第一个示例静态:

有同样的错误:

otool -L 确认每个库都是静态链接的:

调试:

如果我链接到 boost 调试版本,那么它会像预期的那样工作。

0 投票
1 回答
485 浏览

c - ruby 如何在内部表示字符串?

我在为 ruby​​ 创建 C-Extension 时遇到了一些麻烦,这让我开始思考。我想知道 Ruby (1.9.1) 如何在内部处理字符串(以及所有编码的东西)?

如果我有一个类似 的字符串"o",并将该字符串传递给一个 C-Function (as ),我可以使用和宏VALUE很容易地处理它。但是,如果我制作字符串(德语变音符号),会给我.RSTRING_PTR()RSTRING_LEN()öRSTRING_LEN()2

在那种情况下,我对 的内容有点困惑RSTRING_PTR(),这两个字节是0xA40xC3。这是什么编码?在将字符串传递给 C 函数之前,我尝试使用"ö".force_encoding( ... )不同的编码,但这根本不影响的内容RSTRING_PTR

我需要的是一种在我的 C 函数中将字符串表示为WCHAR*编码UTF-16(在 的情况下为.."ö"0x00F6

感谢您提前提供任何帮助

0 投票
1 回答
5281 浏览

c - 如何在 Windows 上编译 Ruby C 扩展并链接 libcurl

我正在尝试构建一个使用 libcurl 的 Ruby C 扩展。到目前为止,我已经在 Os X 上成功构建了它。但是我在 Windows 中开发的经验要少得多,并且不完全确定如何去做。

到目前为止,我可以按照这些说明或多或少地使用 Visual Studio 命令提示符中的 extconf.rb 和 nmake 编译 Ruby C 扩展

http://blogs.law.harvard.edu/hoanga/2006/12/14/getting-a-ruby-c-extension-to-compile-on-windows/

但是我的扩展链接 libcurl,在 extconf.rb 中有一行来检查这个

创建makefile时,我得到

在运行 nmake 时,我得到

这都是意料之中的,因为它没有安装。我已经下载了 curl-7.26.0-devel-mingw64 (我认为这适用于 Windows 7)

我只是不知道在 Windows 环境中我应该把 /bin 或 /include 放在哪里,以便我的编译器可以找到它们。

0 投票
1 回答
163 浏览

ruby - 如何防止收集对 Ruby 对象的本地引用

我的情况是,我必须在 C++ 代码中从 ruby​​ 线程而不是 ruby​​ 线程中构建一些更大的 ruby​​ 数据结构。

在堆栈上创建的 ruby​​ 对象是否必须经过特殊处理才能不被 ruby​​ GC 收集?如果对象是在 ruby​​ 或非 ruby​​ 线程上创建的,有什么区别吗?

例子:

我希望每个函数调用都可以分配内存,从而调用垃圾收集器。我是否必须特别注意保护 h、k 和 v 不被收集,直到它们可以通过任何全局变量访问?也许是这样的:

第二个版本要复杂得多,所以我想避免它,如果有任何保证 GC 扫描所有线程以查找可能的引用。

编辑:我刚刚意识到,我可能不应该使用 rb_gc 之类的函数...来自不包含 gvl 的非 ruby​​ 线程。因此,保证 GC 将标记来自 ruby​​ 堆栈的引用就足够了。

TIA 托尔斯滕

0 投票
1 回答
182 浏览

c - 使用 Ruby C API 测试符号的相等性

我正在尝试找到一种在 Ruby C API 中测试符号相等性的方法。考虑以下 C 函数:

从 Ruby 的角度来看,此方法的行为与预期不同:

为什么会这样?我如何需要更改代码以实现预期的行为?

0 投票
4 回答
42664 浏览

ruby-on-rails - 错误:在 mac mountian lion os 上安装 rails 时无法构建 gem 原生扩展

我最近更新到 Mountain Lion 并重新安装了 Ruby,但是当我尝试运行测试 Rails 应用程序时,我收到一条错误消息,提示“我的系统上当前未安装 Rails”。我按照它说的做,输入sudo gem install rails并获取:

但是当我检查安装了哪个 Rails 版本时,我得到了以下信息:

我也试过gem install rails并得到:

0 投票
1 回答
211 浏览

c - Ruby C 扩展编译错误:“事件”之前的预期“)”

我正在尝试使用 C 扩展来扩展 Ruby,以添加事件挂钩。

不幸的是,我收到以下错误:

我写的代码:

有人可以帮我解决这个问题吗?提前致谢。

0 投票
2 回答
220 浏览

c - 在 Ruby 中创建 C 扩展

我正在尝试为 ruby​​ 创建一个 C 扩展。我对开发非常陌生,刚刚熟悉 Ruby,所以我真的迷路了。

我看过“如何在五分钟内用 Ruby 创建 C 扩展”,这很有意义。问题是我不知道使用什么程序来编译 C 代码和 Ruby 代码。我一直在为我的 Ruby 编程使用文本文档,所以我从来不需要编译它们。

如果我想做一个 C 扩展(按照前面提到的模型)我应该使用什么 IDE,我应该编译成什么文件格式?另外,我在哪里放置 Ruby 文件和 C 编译文件?最后,一个简单的记事本编辑器能用于这个 Ruby 开发吗?请记住,我一般是编程新手,所以这些问题可能显得幼稚。