4

の柔軟性がないmkmfため、C コードの管理が難しくなっています。このため、別のビルド システムを使用したいと考えています。

C 拡張機能をビルドするには何がrubygems必要ですか? 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 など) が、私は gem を使用することを好みますRubyInline。これは、Ruby コードの低速でパフォーマンスが重要なセクションを他の言語の実装に置き換えるように設計されています (たとえば、C はすぐにサポートされます) が、外部 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 ディストリビューションのリポジトリで利用できるようになり、そのようなソリューションのメンテナンスは、C ライブラリの単なるラッパーである他のすべての gem と同様になります。

于 2012-03-12T15:14:44.727 に答える
0

ruby-ffiを見てみましょ
う 既存のライブラリにリンクするので、ディレクトリ構造を強制しません

またhttp://guides.rubygems.org/c-extensions/

于 2012-03-09T09:55:21.897 に答える