5

在 CentOS 5.7 机器上,我无法安装最新版本的 mysql2 gem;它没有找到 errmsg.h:

/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,但我不确定。

我深入研究了 extconf.rb 源代码,发现它正在使用该have_header方法来定位头文件。我调试了执行以发现它正在寻找“mysql/errmsg.h”的相对路径。但是我还没有找到任何文档来解释它如何将其扩展为绝对路径。

have_header 在哪里以及如何定位其头文件?

4

1 回答 1

13

我相信我已经找到了答案。

看来是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

当然,您找到了解决方法,即包含dir_config('mysql')在您的extconf.rb. 这使您能够使用该--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?

于 2012-08-27T19:01:32.840 回答