Ruby 的 have_header 方法在哪里查找头文件?

Posted

技术标签:

【中文标题】Ruby 的 have_header 方法在哪里查找头文件?【英文标题】:Where does Ruby's have_header method look for header files? 【发布时间】:2012-06-19 12:56:21 【问题描述】:

在 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 在哪里以及如何定位它的头文件?

【问题讨论】:

FWIW,我通过在 gem 安装命令中包含 --with-mysql-include=/usr/include/mysql 绕过了实际问题。不过,如果能回答这个问题还是很高兴的。 【参考方案1】:

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

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?

【讨论】:

注意:我最近发现dir_config 的工作方式不一致。它可能适用于 mysql,但由于某种原因不适用于 ATLAS。 谢谢你,这对我帮助很大

以上是关于Ruby 的 have_header 方法在哪里查找头文件?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 顶层定义的方法在哪里?

Ruby / Rails——从哪里包含一个方法? [复制]

我在哪里可以编写要在部分中使用的方法? (Ruby on Rails)

在 Ruby on Rails 项目中将“关注点”存储在哪里? (轨道 5.2+)

在哪里可以找到像 instance_exec 这样的 Native Ruby 源代码?

mac的ip地址在哪里查