问题标签 [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 gem 的目录
我目前正在尝试在 Ruby 中创建自己的 gem。gem 需要一些静态资源(比如 ICO 格式的图标)。我应该将这些资源放在我的 gem 目录树中的什么位置,以及如何从代码中访问它们?
此外,我的扩展部分是本机 C 代码,我希望 C 部分也可以访问资源。
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
?
c++ - 无法创建 C++ Ruby 扩展
我在创建 ruby 扩展以导出我在 OSX 下写入 ruby 的 C++ 库时遇到问题。这个简单的例子:
导致抛出 bad_cast 异常:
我编译扩展:
最后将动态库与:
我在网上搜索并尝试了各种链接和编译器开关。如果我构建一个可执行文件就没有这样的问题。有没有其他人遇到过这样的问题并找到了解决方案?
我对此进行了进一步调查,发现导致异常的函数如下所示:
在 std::collate<> 的源代码中,我找到了 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 调试版本,那么它会像预期的那样工作。
c - ruby 如何在内部表示字符串?
我在为 ruby 创建 C-Extension 时遇到了一些麻烦,这让我开始思考。我想知道 Ruby (1.9.1) 如何在内部处理字符串(以及所有编码的东西)?
如果我有一个类似 的字符串"o"
,并将该字符串传递给一个 C-Function (as ),我可以使用和宏VALUE
很容易地处理它。但是,如果我制作字符串(德语变音符号),会给我.RSTRING_PTR()
RSTRING_LEN()
ö
RSTRING_LEN()
2
在那种情况下,我对 的内容有点困惑RSTRING_PTR()
,这两个字节是0xA4
和0xC3
。这是什么编码?在将字符串传递给 C 函数之前,我尝试使用"ö".force_encoding( ... )
不同的编码,但这根本不影响的内容RSTRING_PTR
。
我需要的是一种在我的 C 函数中将字符串表示为WCHAR*
编码UTF-16
(在 的情况下为.."ö"
0x00F6
感谢您提前提供任何帮助
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 放在哪里,以便我的编译器可以找到它们。
ruby - 如何防止收集对 Ruby 对象的本地引用
我的情况是,我必须在 C++ 代码中从 ruby 线程而不是 ruby 线程中构建一些更大的 ruby 数据结构。
在堆栈上创建的 ruby 对象是否必须经过特殊处理才能不被 ruby GC 收集?如果对象是在 ruby 或非 ruby 线程上创建的,有什么区别吗?
例子:
我希望每个函数调用都可以分配内存,从而调用垃圾收集器。我是否必须特别注意保护 h、k 和 v 不被收集,直到它们可以通过任何全局变量访问?也许是这样的:
第二个版本要复杂得多,所以我想避免它,如果有任何保证 GC 扫描所有线程以查找可能的引用。
编辑:我刚刚意识到,我可能不应该使用 rb_gc 之类的函数...来自不包含 gvl 的非 ruby 线程。因此,保证 GC 将标记来自 ruby 堆栈的引用就足够了。
TIA 托尔斯滕
c - 使用 Ruby C API 测试符号的相等性
我正在尝试找到一种在 Ruby C API 中测试符号相等性的方法。考虑以下 C 函数:
从 Ruby 的角度来看,此方法的行为与预期不同:
为什么会这样?我如何需要更改代码以实现预期的行为?
ruby-on-rails - 错误:在 mac mountian lion os 上安装 rails 时无法构建 gem 原生扩展
我最近更新到 Mountain Lion 并重新安装了 Ruby,但是当我尝试运行测试 Rails 应用程序时,我收到一条错误消息,提示“我的系统上当前未安装 Rails”。我按照它说的做,输入sudo gem install rails
并获取:
但是当我检查安装了哪个 Rails 版本时,我得到了以下信息:
我也试过gem install rails
并得到:
c - Ruby C 扩展编译错误:“事件”之前的预期“)”
我正在尝试使用 C 扩展来扩展 Ruby,以添加事件挂钩。
不幸的是,我收到以下错误:
我写的代码:
有人可以帮我解决这个问题吗?提前致谢。
c - 在 Ruby 中创建 C 扩展
我正在尝试为 ruby 创建一个 C 扩展。我对开发非常陌生,刚刚熟悉 Ruby,所以我真的迷路了。
我看过“如何在五分钟内用 Ruby 创建 C 扩展”,这很有意义。问题是我不知道使用什么程序来编译 C 代码和 Ruby 代码。我一直在为我的 Ruby 编程使用文本文档,所以我从来不需要编译它们。
如果我想做一个 C 扩展(按照前面提到的模型)我应该使用什么 IDE,我应该编译成什么文件格式?另外,我在哪里放置 Ruby 文件和 C 编译文件?最后,一个简单的记事本编辑器能用于这个 Ruby 开发吗?请记住,我一般是编程新手,所以这些问题可能显得幼稚。