2012-06-16 23 views
5

CentOS 5.7のボックスで、mysql2 gemの最新バージョンをインストールするのに問題があります。それはerrmsg.hを見つけていない:Rubyのhave_headerメソッドはどこでヘッダファイルを探しますか?

/usr/bin/ruby extconf.rb 
checking for rb_thread_blocking_region()... yes 
checking for rb_wait_for_single_fd()... no 
checking for mysql_query() in -lmysqlclient... yes 
checking for mysql.h... no 
checking for mysql/mysql.h... yes 
checking for errmsg.h... no 
----- 
errmsg.h is missing. please check your installation of mysql and try again. 
----- 
*** extconf.rb failed *** 

MySQLのヘッダファイルは、/ usr /含める/ mysqlので存在します。古いバージョンのgemがサーバー上に存在するため、ある時点で正常に構築されている必要があります。

mysql.hのチェックで失敗しますが、mysql/mysql.hで成功します。ただし、errmsg.hではこれを繰り返さない。これで私は/ usr/includeを見ていないと推測していますが、わかりません。

私はextconf.rbソースコードを掘り下げて、ヘッダファイルを見つけるのにhave_headerメソッドを使っていることを発見しました。実行をデバッグして、 "mysql/errmsg.h"という相対パスを探していることを確認しました。しかし、絶対パスに展開する方法を説明するドキュメントは見つかりませんでした。

&どのようにhave_headerがヘッダファイルを探しますか?

+1

FWIW、私は= --with-mysqlの-含ま '含めることにより、実際の問題をバイパス/ usr/include/mysql'をgem instalコマンドに追加します。しかし、この質問に答えるのはまだ素晴らしいです。 –

答えて

12

私は答えを見つけたと信じています。

have_headerは、システムのインクルードパスを調べているようです。関連する環境変数が設定されていない場合、デフォルトのインクルードパスは/usr/local/include/usr/includeです。ヘッダファイルはCファイルである場合は、C++プログラムをコンパイルしている場合にも当てはまります

export C_INCLUDE_PATH=/usr/include/mysql/ 

:あなたがそれらを手動で設定する場合は

、あなたのような何かをするだろう。一方、あなたのヘッダファイルは、C++、ないCである場合、あなたはどうなる:もちろん

export CPLUS_INCLUDE_PATH=/usr/include/mysql 

を、あなたは仕事の周りに、あなたのextconf.rbdir_config('mysql')を含めることです発見しました。これにより、--with-mysql-includeオプションを使用して手動でパスを指定することができます。ここで

は私のソースです:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html

そして、ここでは(答え)同じ質問のより一般的なバージョンです:How to add a default include path for gcc in linux?

+1

注:私は最近、 'dir_config'が矛盾しているだけであることを発見しました。それはmysqlで動作するかもしれませんが、何らかの理由でATLASで動作しません。 –

+0

ありがとう、これは私を大いに助けました –

関連する問題