0

ext / Q/flagvalue.cに単純な拡張子があります

私のext/Q/extconfig.rbは次のようになります。

require 'mkmf'
create_makefile('Q/flagvalue')

Rakefileのタスクは、次のように設定されています。

Rake::ExtensionTask.new("Q") do |extension|
  extension.lib_dir = 'lib/Q'
end

rake buildがすると、次の出力が得られます。

mkdir -p tmp / x86_64-linux / Q / 1.9.3
cd tmp / x86_64-linux / Q / 1.9.3
/usr/local/rvm/rubies/ruby-1.9.3-p286/bin/ruby-I。../../../../ext/Q/extconf.rb
Makefileの作成
CD -
cd tmp / x86_64-linux / Q / 1.9.3
作る
コンパイル../../../../ext/Q/flagvalue.c
共有オブジェクトQ/flagvalue.soのリンク
CD -
インストール-ctmp/ x86_64-linux / Q / 1.9.3 / Q.so lib / Q / Q.so
レーキが中止されました!
そのようなファイルやディレクトリはありません-tmp/x86_64-linux / Q / 1.9.3 / Q.so

したがって、コンパイラはflagvalue.soをコンパイルしてリンクし、インストーラは存在しないQ.soをインストールしようとしているようですこのエラーはどこから発生し、どうすればよいですか?

4

2 に答える 2

1

あなたのでこれを試してくださいRakefile

Rake::ExtensionTask.new 'flagvalue' do |extension|
  extension.ext_dir = 'ext/Q'
  extension.lib_dir = 'lib/Q'
end

Rakeタスクはターゲットとして何を指定するかを知らないextconf(つまり、Qディレクトリを知らない)ため、これにはいくつかの重複が伴います。そのため、再度指定する必要があります。Qこれは、タスクがtmpプロジェクトのディレクトリの下に作成する構造にディレクトリがないことも意味しますが、それはおそらく問題ではありません。

于 2012-11-22T23:55:43.757 に答える
0

さて、いくつか掘り下げた後(そしていくつかの漠然とした推測:-Δ)、私は解決策を見つけました:

( Writehack.comから)gemspecのコードを取得しました。

s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

この方法の問題は、コンパイルするだけのバイナリがすでにリポジトリにある必要があることです。正しい方法は、ext-directoryから* .c-filesを取得し、次のように*.soに名前を変更することでした。

s.executables   = s.files.grep(%r{^ext/.*c$}).map{ |f| File.basename(f, '.c') + '.so'}
s.bindir        = 'bin'

また、bindirをのRakefileExtensionTaskに追加し、仕様からファイルを取得するようにします。

spec = Gem::Specification.load('Q.gemspec')
spec.executables.each do |f|
  Rake::ExtensionTask.new('Q', spec) do |ext|
    ext.name    = f.gsub(/\.so$/,'')
    ext.tmp_dir = 'tmp'
    ext.lib_dir = 'bin'
  end
end

:-Δ

于 2012-11-23T00:23:42.467 に答える