2012-06-16 25 views
5

在CentOS 5.7中,我無法安裝最新版本的mysql2 gem;它沒有找到errmsg.h:Ruby的has_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/include/mysql。服務器上存在較早版本的gem,因此它必須在某一時刻成功構建。

請注意,它在檢查mysql.h時失敗,但在mysql/mysql.h中成功。但是,它不會對errmsg.h重複此操作。通過這個我猜測它沒有看/ usr/include,但我不確定。

我挖掘了e​​xtconf.rb源代碼,發現它使用have_header方法來查找頭文件。我調試了執行,發現它正在尋找一個「mysql/errmsg.h」的相對路徑。但是我還沒有找到任何解釋它如何將其擴展到絕對路徑的文檔。

Where & have_header如何找到它的頭文件?

+1

FWIW,我通過包含繞過實際問題'--with-mysql的,包括=/usr/include/mysql'中的gem instal命令。儘管有這個問題的答案仍然很好。 –

回答

12

我相信我找到了答案。

看起來have_header看起來在系統包含路徑。如果未設置相關環境變量,則默認包含路徑爲/usr/local/include/usr/include

如果你想手動設置,你會做這樣的事情:

export C_INCLUDE_PATH=/usr/include/mysql/ 

,即使你正在編譯一個C++程序,如果頭文件是C文件是真實的。如果,另一方面,你的頭文件是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

謝謝,這對我非常有幫助 –