我目前正在尝试在Ruby中创建自己的gem.gem需要一些静态资源(比如ICO格式的图标).我在哪里将这些资源放在我的gem目录树中以及如何从代码中访问它们?
此外,我的扩展的一部分是本机C代码,我希望C部分也可以访问资源.
我想知道如何将C扩展中编写的本机方法添加到预先存在的Ruby类中?我只找到了允许你创建新Ruby类的函数,但是没有一个函数可以返回一个预先存在的类.
我正在为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,这些函数本身就充斥着更多的静态函数,因此几乎不可能解开...我需要另一种方式)
由于缺乏灵活性,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) 我正在尝试构建一个使用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以便我的编译器可以找到它们.
我试图找到一种方法来测试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)
为什么会这样?我如何更改代码以实现预期的行为?
也许这是一个非常明显的答案,但我正在尝试在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 C 扩展中包装 C 结构,但在文档中找不到 Data_Wrap_Struct 和 TypedData_Wrap_Struct 之间的区别,这两个函数有什么区别?
我正在尝试为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)
我读到它没有害处,但有没有办法避免这种警告?有同样的问题一个人在这里,但解决方案无法找到.
我构建了一个Ruby gem,它需要一些C扩展。一旦编译完成,就通过Ruby FFI将其绑定到gem中。
我的设置:我将bundle用于宝石支架。在我的gems文件夹中,有一个子文件夹ext。这包括一个静态Makefile,另一个子文件夹source和一个extconf.rb。
该source文件夹包含所有.c和.h文件。
Makefile不必动态创建。如果我呼吁make clean && make在ext一切编译,以及宝石的作品如预期。
现在,我给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并尝试将其安装在另一台计算机上时,该扩展名未编译。
谁能告诉我,为了让扩展在安装时自动编译,我该怎么做?