4

由于. _ mkmf出于这个原因,我想使用另一个构建系统。

rubygems构建 C 扩展需要什么?如何将autotools/之类的构建系统集成configure到工作流程中?

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

3 回答 3

5

有一些工具可以帮助解决这种情况(例如rake-compilergem),但我更喜欢使用RubyInlinegem。它旨在用其他语言的实现(例如,开箱即用地支持 C)替换 Ruby 代码中缓慢的、性能关键的部分,但它也用于内联调用外部 C 库的代码。

一个 RubyInline 示例如下所示:

class MyClass
  inline(:C) do |builder|
    builder.include '<stdio.h>'
    builder.c <<-END
      void my_printf(char * string){
        printf("%s\\n",string);
      }
    END
  end
end
MyClass.new.my_printf("Abc") 
# prints 'Abc'

RubyInline 的优点是您不必为 C 和 Ruby 保留单独的文件,开箱即用地支持一些基本的参数转换,并且您不必编写粘合代码。不好的部分是您无法完全控制编译等。我个人认为 RubyInline 是一个非常强大的解决方案。

于 2012-03-03T18:02:44.607 回答
4

如果 C 代码非常复杂(因为您提到了 autotools 和 configure 我假设它是)为什么不考虑构建独立于 Ruby 的单独的 C 库?然后用粘合代码构建一个小而简单的 Ruby gem。最终,C 库将在 Debian 或其他 Linux 发行版的存储库中可用,并且此类解决方案的维护将类似于所有其他 gem,它们只是 C 库的包装器。

于 2012-03-12T15:14:44.727 回答
0

看看ruby​​-ffi
它链接到现有的库,所以不强制任何目录结构

还有http://guides.rubygems.org/c-extensions/

于 2012-03-09T09:55:21.897 回答