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 on Rails)
在 Ruby on Rails 项目中将“关注点”存储在哪里? (轨道 5.2+)