2012-06-16 13 views
5

In una scatola di CentOS 5.7, ho problemi nell'installare la versione più recente della gemma mysql2; non è trovare errmsg.h: esistonoDove si trova il metodo have_header di Ruby per i file di intestazione?

file 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 in/usr/include/mysql. Sul server esiste una versione precedente della gemma, quindi deve essere stata creata correttamente in un punto.

Si noti che non riesce su un controllo per mysql.h, ma riesce su mysql/mysql.h. Tuttavia, non lo ripete per errmsg.h. Con questo immagino che non stia guardando/usr/include, ma non ne sono sicuro.

Ho scavato nel codice sorgente extconf.rb e ho scoperto che sta usando il metodo have_header per localizzare i file di intestazione. Ho eseguito il debug dell'esecuzione per scoprire che sta cercando un percorso relativo di "mysql/errmsg.h". Ma non ho trovato alcuna documentazione che spieghi come si espande in un percorso assoluto.

Dove & come fahead_header a localizzare i suoi file di intestazione?

+1

FWIW, ho aggirato il problema reale includendo '--with-mysql-includono =/usr/include/mysql' nel comando gem instal. Sarebbe comunque bello avere una risposta a questa domanda. –

risposta

12

Credo di aver trovato una risposta.

Sembra che have_header analizzi il percorso di inclusione del sistema. Se le variabili di ambiente rilevanti non sono impostate, i percorsi di inclusione predefiniti sono /usr/local/include e /usr/include.

Se si desidera impostare manualmente, si potrebbe fare qualcosa di simile:

export C_INCLUDE_PATH=/usr/include/mysql/ 

Questo è vero anche se si sta compilando un programma C++, se il file di intestazione è un file C. Se, d'altra parte, il file di intestazione è C++, non C, si farebbe:

export CPLUS_INCLUDE_PATH=/usr/include/mysql 

Naturalmente, hai trovato il work-around, che è quello di includere nel vostro dir_config('mysql')extconf.rb. Ciò consente di utilizzare l'opzione --with-mysql-include e fornire il percorso manualmente.

Ecco la mia fonte: http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html

Ed ecco una versione più generale della stessa domanda (risposte): How to add a default include path for gcc in linux?

+1

Nota: recentemente ho scoperto che 'dir_config' funziona solo in modo incoerente. Potrebbe funzionare con mysql, ma non con ATLAS per qualche motivo. –

+0

Grazie, questo mi ha aiutato moltissimo –

Problemi correlati