0

ruby から呼び出したいコードを c で作成しました。この記事をガイドとして使用しましたが、問題をリンクせずに実行するのに問題があります。

まず、ソース ファイルを自分のext/NAME/ディレクトリに直接コピーする必要があります。それらをそのディレクトリにサブモジュール化した場合、それらはピックアップされないようです。つまり、のようなサブディレクトリの下にあるということext/NAME/CLIB_GIT_SUBMODULE_FILES/です。

次に、c プロジェクトの makefile を実行する必要があるようです。そうしないと、segfault が発生します。makefileを実行する.oと、ext/NAMEディレクトリにオブジェクト ファイル (/test/

linking shared-object NAME/NAME.so
gcc: error: SOMEFILE_ONE.o: No such file or directory
gcc: error: SOMEFILE_TWO.o: No such file or directory
gcc: error: SOMEFILE_THREE.o: No such file or directory
make: *** [ruby_fast_numerizer.so] Error 1
rake aborted!

その下でmakefileを実行すると、などext/NAME/が作成されることに注意してください。SOMEFILE_ONE.o

この時点で何が起こっているのかわかりません:(ガイドはすべてext/NAME、既存のcライブラリをラップするのではなく、ディレクトリに新しいcコードを書いているようです。nokogiriのようなガイダンスのために他のプロジェクトを見てみましたが、彼らはやっていますはるかに多く、ふるいにかけるのが難しくなります。

どんな助けでも大歓迎です!

4

1 に答える 1

0

拡張機能の構築

通常、(MakeMakefile) をext/NAME/extconf.rb使用して、提供されたソースから Ruby 拡張機能をビルドするためのすべての構成を含む新しい Makefile を作成します。mkmfMakeMakefile には、ソース コード、ヘッダー、およびその他すべての部分を見つける場所のデフォルトがありますが、それらを上書きすることができます (dir_config例を使用)。

生成された Makefile には、ソース ファイルをコンパイルし、すべてを関連する Ruby ライブラリにリンクして、ネイティブの Ruby 拡張機能を生成するための指示が含まれています。

Ruby とは関係のない既存の C ライブラリがある場合は、おそらく独自の Makefile とビルド プロセスがあります。Ruby が生成した Makefile と独自の Makefile を混同しないでください。

ライブラリのロード

既存の C ライブラリをラップするために、ネイティブ拡張機能をまったく構築せず、ライブラリを FFI でロードします。2 つの主要な FFI オプションは、Fiddle (Ruby に付属していますが、チュートリアルはほとんどありません) またはffigem (より適切に文書化されていますが、gem が必要です) です。

その他のリソース

于 2016-10-30T08:42:48.010 に答える