由于. _ mkmf
出于这个原因,我想使用另一个构建系统。
rubygems
构建 C 扩展需要什么?如何将autotools
/之类的构建系统集成configure
到工作流程中?
Gem::Specification.new 'my_gem' do |gem|
# Will this work?
gem.extensions = %w(ext/my_gem/configure)
end
由于. _ mkmf
出于这个原因,我想使用另一个构建系统。
rubygems
构建 C 扩展需要什么?如何将autotools
/之类的构建系统集成configure
到工作流程中?
Gem::Specification.new 'my_gem' do |gem|
# Will this work?
gem.extensions = %w(ext/my_gem/configure)
end
有一些工具可以帮助解决这种情况(例如rake-compiler
gem),但我更喜欢使用RubyInline
gem。它旨在用其他语言的实现(例如,开箱即用地支持 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 是一个非常强大的解决方案。
如果 C 代码非常复杂(因为您提到了 autotools 和 configure 我假设它是)为什么不考虑构建独立于 Ruby 的单独的 C 库?然后用粘合代码构建一个小而简单的 Ruby gem。最终,C 库将在 Debian 或其他 Linux 发行版的存储库中可用,并且此类解决方案的维护将类似于所有其他 gem,它们只是 C 库的包装器。
看看ruby-ffi
它链接到现有的库,所以不强制任何目录结构