2012-02-16 25 views
7

私は/ usr/local/libにいくつかのネイティブライブラリをインストールしました。Rubyにネイティブライブラリを見つける方法を教えてください。

を正しくビルドするためにこれらを必要とする宝石をインストールしようとしていますが、 ライブラリが見つからないため、宝石ビルドに失敗します。

gemのextconf.rbファイルは、 have_library()でライブラリを見つけることを試みますが、これは何らかの理由で失敗します。

私は、環境変数の束を設定しようとしたが、何も動いていないようにみえ:

irb(main):003:0> require 'mkmf' 
=> true 
irb(main):004:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):005:0> ENV['LD_LIBRARY_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):006:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):007:0> ENV['DYLD_LIBRARY_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):008:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):009:0> have_library('libgecodesearch') 
checking for main() in -llibgecodesearch... no 
=> false 
irb(main):010:0> ENV['C_INCLUDE_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):011:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):012:0> ENV['PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):013:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 

この問題を解決する最良の方法は何ですか?

+0

私が直接このような状況に遭遇したことがありませんが、私はあなたが '$ LOAD_PATH'(へのパスを追加した場合と仮定しています'$:' "/ usr/local/lib/mylib" 'あるいは、Rubyインタプリタを1つ以上の[' -I'](http:// www .zenspider.com/Languages/Ruby/QuickRef.html#コマンドラインオプション)オプション: 'ruby -I/usr/local/lib/mylib foo。rb' – Phrogz

+0

残念ながら、それはそうではありません。 'irb(main):001:0> 'mkmf''を必要とします。 ' => true' 'irb(main):002:0> $:<< "/ usr/local/lib" ' ' => ["/usr/pkg/lib/ruby/site_ruby/1.9"、 "/usr/pkg/lib/ruby/site_ruby/1.9/i386-netbsdelf"、 "/" usr/pkg/lib/ruby​​/site_ruby "、" /usr/pkg/lib/ruby/vendor_ruby/1.9 "、" /usr/pkg/lib/ruby/vendor_ruby/1.9/i386-netbsdelf "、"/usr/pkg /usr/pkg/lib/ruby/1.9/ "/ usr/local/lib"、 "/ lib/ruby​​/vendor_ruby"、 "/usr/pkg/lib/ruby/1.9"、 "/usr/pkg/lib/ruby/1.9/i386-netbsdelf"" main()で-lgecodesearchをチェックしています...いいえ => false" –

+0

ルートを追加しないでください'/ usr/local/lib'をロードパスに追加するには、ライブラリアンの実際のディレクトリ/ディレクトリあなたは必要です。 Rubyは、ロードパス内のディレクトリの下にあるすべてのディレクトリを階層的に検索しません。 – Phrogz

答えて

2

私はコメントを読んだことがありました。あなたはそれをうまく機能させたことを知っていますが、問題の適切な解決策があると思います。

have_libraryは、ご使用の環境で特定のライブラリを使用できるかどうかを確認します。これは、ライブラリヘッダーをインクルードし、その関数の1つを一時的なCソースファイルに使用することによって行われます。成功すれば、図書館は利用可能でなければならない。 geocodesearchから

have_library 'geocodesearch' 
checking for main() in -lgecodesearch... no 

have_libraryできない使用main機能。これは、ライブラリが使用できないか、関数が存在しないことを意味します。あなたの場合、おそらく後者です。

have_libraryには、第2引数を渡して試してみることができます。例:あなたが指定しない場合

have_library 'geocodesearch', 'geocodesearch_version' 
checking for geocodesearch_version() in -lgecodesearch... 

、それは単にmain機能を探します。また、ヘッダが含まれるように指定することができます。

have_library 'geocodesearch', 'geocodesearch_version', %w(geocode/search.h) 

をコメントの中で、あなたは単にhave_library呼び出しを排除することで、あなたの問題を解決したと述べました。これはローカライズされたソリューションです。あなたはそれを新しいバージョンのgemに再適用する必要があります。

必要な調整を含むプルリクエストを著者に送信することをおすすめします。バグは永久に修正され、同じ問題を抱えている可能性のある他の人にも役立ちます。

mkmf参照:

関連する問題