2012-06-16 14 views
5

En una caja de CentOS 5.7, tengo problemas para instalar la versión más nueva de la gema mysql2; no es la búsqueda de errmsg.h: existen¿Dónde el método have_header de Ruby busca archivos de encabezado?

archivos de cabecera
/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 en/usr/include/mysql. Existe una versión anterior de la gema en el servidor, por lo que debe haberse construido con éxito en un punto.

Tenga en cuenta que falla en una comprobación de mysql.h, pero tiene éxito en mysql/mysql.h. Sin embargo, no repite esto para errmsg.h. Con esto, supongo que no está mirando/usr/include, pero no estoy seguro.

He buscado en el código fuente extconf.rb y descubrí que está utilizando el método have_header para localizar los archivos de encabezado. Depuré la ejecución para descubrir que está buscando una ruta relativa de "mysql/errmsg.h". Pero no he encontrado ninguna documentación que explique cómo se expande en una ruta absoluta.

Donde & ¿cómo has_header encuentra sus archivos de cabecera?

+1

Fwiw, que pasa por alto el problema real mediante la inclusión de '--with-mysql-include =/usr/include/mysql' en el comando gem instal. Sin embargo, sería bueno tener una respuesta a esta pregunta. –

Respuesta

12

Creo que he encontrado una respuesta.

Parece que have_header mira el sistema include path. Si las variables de entorno relevantes no están configuradas, las rutas de inclusión predeterminadas son /usr/local/include y /usr/include.

Si desea configurar manualmente, usted haría algo como:

export C_INCLUDE_PATH=/usr/include/mysql/ 

Eso es cierto incluso si está compilando un programa en C++, si el archivo de cabecera es un archivo C. Si, por el contrario, el archivo de cabecera es C++, C no, que haría:

export CPLUS_INCLUDE_PATH=/usr/include/mysql 

Por supuesto, se encontró la solución alternativa, que consiste en incluir en su dir_config('mysql')extconf.rb. Eso le permite usar la opción --with-mysql-include y proporcionar la ruta manualmente.

Aquí es mi fuente: http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html

Y aquí es una versión más general de la misma pregunta (con respuestas): How to add a default include path for gcc in linux?

+1

Nota: Recientemente descubrí que 'dir_config' funciona solo de forma inconsistente. Puede funcionar con mysql, pero no con ATLAS por alguna razón. –

+0

Gracias, esto me ayudó tremendamente –

Cuestiones relacionadas