标签: ruby-c-extension

"资源" - 红宝石宝石的目录

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

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

ruby gem ruby-c-extension

4
推荐指数
1
解决办法
1337
查看次数

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

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

ruby ruby-c-extension

4
推荐指数
1
解决办法
450
查看次数

如何在Ruby C API中有效地合并两个哈希?

我正在为Ruby编写一个C扩展,它真的需要合并两个哈希,但是rb_hash_merge()函数在Ruby 1.8.6中是STATIC.我尝试过使用:

rb_funcall(hash1, rb_intern("merge"), 1, hash2);
Run Code Online (Sandbox Code Playgroud)

但这太慢了,在这个应用程序中性能非常关键.

有谁知道如何以效率和速度来执行此合并?

(注意我已经尝试过简单地查看rb_hash_merge()的源代码并复制它,但它与其他静态函数一起使用RIDDLED,这些函数本身就充斥着更多的静态函数,因此几乎不可能解开...我需要另一种方式)

c ruby ruby-c-extension

3
推荐指数
1
解决办法
636
查看次数

如何使用rubygems的其他构建系统?

由于缺乏灵活性,mkmf我的C代码越来越难以管理.出于这个原因,我想使用另一个构建系统.

什么是rubygems需要以建设一个C扩展?如何将类似autotools/ 构建系统集成configure到工作流程中?

Gem::Specification.new 'my_gem' do |gem|
  # Will this work?
  gem.extensions = %w(ext/my_gem/configure)
end
Run Code Online (Sandbox Code Playgroud)

ruby gem rubygems build-script ruby-c-extension

3
推荐指数
1
解决办法
231
查看次数

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

我正在尝试构建一个使用libcurl的Ruby C Extensions.到目前为止,我已经在Os X上成功构建了它.但是我在Windows开发方面经验不足,我不确定如何去做.

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

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

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

# Make sure the cURL library is installed.
have_library("curl")
Run Code Online (Sandbox Code Playgroud)

在创建makefile时,我明白了

checking for main() in curl.lib... no
creating Makefile
Run Code Online (Sandbox Code Playgroud)

当我运行nmake时,我明白了

fatal error C1083: Cannot open include file: 'curl/curl.h': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是所有预期的,因为它没有安装.我已经下载了curl-7.26.0-devel-mingw64(我认为这适用于Windows 7)

我只是想在Windows环境中弄清楚我应该放置/ bin或/ include以便我的编译器可以找到它们.

c ruby windows nmake ruby-c-extension

3
推荐指数
1
解决办法
4034
查看次数

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

我试图找到一种方法来测试Ruby C API中的符号相等性.考虑以下C函数:

static VALUE test_symbol_equality(VALUE self, VALUE symbol) {
  if (rb_intern("test") == symbol) {
    return Qtrue;
  } else {
    return Qfalse;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

test_symbol_equality(:test)    # => false
Run Code Online (Sandbox Code Playgroud)

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

c ruby ruby-c-extension

3
推荐指数
1
解决办法
177
查看次数

Ruby生成的makefile不运行

也许这是一个非常明显的答案,但我正在尝试在Windows环境中使用C扩展Ruby,并且当我运行mingw32时我无法进行扩展 - 使得它生成一个名为"forktest-i386-的文件" mingw32.def"然后说"没有规则来制作目标'ruby.h','forktest.o'需要".

Forktest是我想要扩展的名称.

makefile是由ruby自己的create_makefile命令生成的,它确实令人费解,所以我不能对它做头或者故事,但无论如何它在这里:

SHELL = /bin/sh

# V=0 quiet, V=1 verbose.  other values don't work.
V = 0
Q1 = $(V:1=)
Q = $(Q1:0=@)
n=$(NULLCMD)
ECHO1 = $(V:1=@$n)
ECHO = $(ECHO1:0=@echo)

#### Start of system configuration section. ####

srcdir = .
topdir = /D/Programs/Ruby193/include/ruby-1.9.1
hdrdir = /D/Programs/Ruby193/include/ruby-1.9.1
arch_hdrdir = D:/Programs/Ruby193/include/ruby-1.9.1/$(arch)
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby

DESTDIR = D:
prefix = $(DESTDIR)/Programs/Ruby193
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
exec_prefix = $(prefix)
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
sitehdrdir = $(rubyhdrdir)/site_ruby
rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
vendordir = $(rubylibprefix)/vendor_ruby …
Run Code Online (Sandbox Code Playgroud)

ruby makefile mingw32 ruby-c-extension

3
推荐指数
1
解决办法
1635
查看次数

Data_Wrap_Struct 和 TypedData_Wrap_Struct 之间的区别?

我正在 Ruby C 扩展中包装 C 结构,但在文档中找不到 Data_Wrap_Struct 和 TypedData_Wrap_Struct 之间的区别,这两个函数有什么区别?

c ruby ruby-c-extension

3
推荐指数
1
解决办法
627
查看次数

带有g ++的不需要的警告消息

我正在尝试为Ruby编写c ++扩展.除了主文件,我有一个文件extconf.rb:

require "mkmf"
$libs += " -lstdc++ "
create_makefile("file_name")
Run Code Online (Sandbox Code Playgroud)

并且,在做完之后ruby extconf.rb,当我尝试g++通过键入来编译它时make,我收到警告:

cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++
Run Code Online (Sandbox Code Playgroud)

我读到它没有害处,但有没有办法避免这种警告?有同样的问题一个人在这里,但解决方案无法找到.

c++ ruby warnings g++ ruby-c-extension

2
推荐指数
1
解决办法
2725
查看次数

为什么gem无法自动编译我的C扩展名

我构建了一个Ruby gem,它需要一些C扩展。一旦编译完成,就通过Ruby FFI将其绑定到gem中。

我的设置:我将bundle用于宝石支架。在我的gems文件夹中,有一个子文件夹ext。这包括一个静态Makefile,另一个子文件夹source和一个extconf.rb。

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

Makefile不必动态创建。如果我呼吁make clean && makeext一切编译,以及宝石的作品如预期。

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

require 'mkmf'
require 'fileutils'

# Give it a name
extension_name = 'somename'

# The destination
dir_config extension_name

# Do the work
create_makefile extension_name

# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'
Run Code Online (Sandbox Code Playgroud)

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

当我现在通过构建我的gem rake build并尝试将其安装在另一台计算机上时,该扩展名未编译。

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

ruby rubygems makefile ruby-c-extension ruby-ffi

2
推荐指数
1
解决办法
318
查看次数

标签 统计

ruby ×10

ruby-c-extension ×10

c ×4

gem ×2

makefile ×2

rubygems ×2

build-script ×1

c++ ×1

g++ ×1

mingw32 ×1

nmake ×1

ruby-ffi ×1

warnings ×1

windows ×1