Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 本机C扩展(如果库可用)_Ruby On Rails_Ruby_Ruby C Extension - Fatal编程技术网

Ruby on rails 本机C扩展(如果库可用)

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

我正在构建一个原生C扩展RubyGem,用于生成唯一标识符(find)。如果可能的话(通过C扩展),我希望库使用libuuid,并返回到一个简单的Ruby实现。我目前拥有生成UUID的C和Ruby代码,但是我不知道如何配置成功的回退。有什么想法吗?

该方法有一个返回值:

返回给定的入口点
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的方法解析和编组/解编系统快得多,也可能方便得多。