Ruby on rails 本机C扩展(如果库可用)
我正在构建一个原生C扩展RubyGem,用于生成唯一标识符(find)。如果可能的话(通过C扩展),我希望库使用libuuid,并返回到一个简单的Ruby实现。我目前拥有生成UUID的C和Ruby代码,但是我不知道如何配置成功的回退。有什么想法吗?该方法有一个返回值: 返回给定的入口点Ruby on rails 本机C扩展(如果库可用),ruby-on-rails,ruby,ruby-c-extension,Ruby On Rails,Ruby,Ruby C Extension,我正在构建一个原生C扩展RubyGem,用于生成唯一标识符(find)。如果可能的话(通过C扩展),我希望库使用libuuid,并返回到一个简单的Ruby实现。我目前拥有生成UUID的C和Ruby代码,但是我不知道如何配置成功的回退。有什么想法吗?该方法有一个返回值: 返回给定的入口点func是否可以在lib中找到 因此,您应该能够做到这一点: $defs.push('-DUSE_RUBY_UUID') if !have_library('uuid') create_makefile("iden
func
是否可以在lib
中找到
因此,您应该能够做到这一点:
$defs.push('-DUSE_RUBY_UUID') if !have_library('uuid')
create_makefile("identifier")
然后,如果未定义use\RUBY\u UUID
,则将C设置为使用libuuid,如果已定义,则调用RUBY UUID库
奇怪的是,mkmf.rb
中的和方法为您添加宏:
# File mkmf.rb, line 840
def have_header(header, preheaders = nil, &b)
checking_for header do
if try_header(cpp_include(preheaders)+cpp_include(header), &b)
$defs.push(format("-DHAVE_%s", header.tr_cpp))
true
else
false
end
end
end
但是
have_library
让你自己做。开发者通常做的是提供一个“纯”和“非纯”版本的gem。@Pablo就像两个不同版本的gem一样?我想是的,至少json
gem有一个json_pure
版本。我会先在ruby中定义所有的方法。然后需要C扩展名。如果找到库,请重写某些ruby方法。如果找不到,什么也不做。@David:这取决于他现有的C是如何设置的。完全绕过Ruby直接进入C库要比绕道Ruby的方法解析和编组/解编系统快得多,也可能方便得多。