2

C 拡張が必要な​​ Ruby gem をビルドします。これは一度コンパイルされると、Ruby FFI を介して gem にバインドされます。

私のセットアップ: gem の足場に bundle を使用します。gems フォルダー内にサブフォルダーがありますext。これには、静的な Makefile、別のサブフォルダーsource、および extconf.rb が含まれています。

このsourceフォルダーには、すべての .c および .h ファイルが含まれています。

Makefile を動的に作成する必要はありません。すべてをコンパイルすると、gem は期待どおりに動作しmake clean && makeます。ext

ここで、extconf.rb に次の内容を指定します。

require 'mkmf'
require 'fileutils'

# Give it a name
extension_name = 'somename'

# The destination
dir_config extension_name

# Do the work
create_makefile extension_name

# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'

そこで、最初に mkmf に Makefile を作成させ、後で静的テンプレートで上書きします。バカ。

gem をビルドrake buildして別のマシンにインストールしようとすると、拡張機能がコンパイルされません。

インストール時に拡張機能を自動的にコンパイルするために何をしなければならないか教えてもらえますか?

4

1 に答える 1

6

Neil Slater のヒントのおかげで、解決策は簡単でした: 次のような gemspec ファイルに gem.extension がありませんでした:

s.extensions    = %w[ext/extconf.rb]

同じ問題に直面しているすべての人のために。

于 2013-09-12T13:36:36.410 に答える