2012-06-16 25 views
5

Trên hộp CentOS 5.7, tôi gặp sự cố khi cài đặt phiên bản mới nhất của đá quý mysql2; không tìm thấy errmsg.h:Phương thức has_header của Ruby tìm kiếm các tệp tiêu đề ở đâu?

/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 *** 

Tệp tiêu đề mysql tồn tại tại/usr/include/mysql. Một phiên bản cũ của gem tồn tại trên máy chủ, vì vậy nó phải được xây dựng thành công tại một thời điểm.

Lưu ý rằng nó không thành công khi kiểm tra mysql.h, nhưng thành công trên mysql/mysql.h. Tuy nhiên, nó không lặp lại điều này cho errmsg.h. Bởi điều này tôi đoán rằng nó không nhìn vào/usr/include, nhưng tôi không chắc chắn.

Tôi đã đào vào mã nguồn extconf.rb và phát hiện ra rằng nó đang sử dụng phương thức have_header để định vị tệp tiêu đề. Tôi gỡ lỗi thực hiện để tìm ra rằng nó đang tìm kiếm một đường dẫn tương đối của "mysql/errmsg.h". Nhưng tôi đã không tìm thấy bất kỳ tài liệu nào giải thích cách nó mở rộng nó thành một đường dẫn tuyệt đối.

Nơi & cách has_header định vị tệp tiêu đề của nó?

+1

FWIW, tôi bỏ qua các vấn đề thực tế bằng cách bao gồm '--with-mysql-include =/usr/include/mysql' trong lệnh gem instal. Nó vẫn sẽ được tốt đẹp để có một câu trả lời cho câu hỏi này mặc dù. –

Trả lời

12

Tôi tin rằng tôi đã tìm thấy câu trả lời.

Có vẻ như have_header xem xét hệ thống bao gồm đường dẫn. Nếu các biến môi trường có liên quan không được đặt, các đường dẫn bao gồm mặc định là /usr/local/include/usr/include.

Nếu bạn muốn cài đặt chúng bằng tay, bạn sẽ làm điều gì đó như:

export C_INCLUDE_PATH=/usr/include/mysql/ 

Đó là sự thật ngay cả khi bạn đang biên soạn một chương trình C++, nếu các tập tin tiêu đề là một tập tin C. Nếu, mặt khác, tập tin tiêu đề của bạn là C++, C không, bạn sẽ làm gì:

export CPLUS_INCLUDE_PATH=/usr/include/mysql 

Tất nhiên, bạn tìm thấy những công việc xung quanh, mà là để bao gồm dir_config('mysql') trong extconf.rb của bạn. Điều đó cho phép bạn sử dụng tùy chọn --with-mysql-include và cung cấp đường dẫn theo cách thủ công.

Đây là nguồn của tôi: http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html

Và đây là một phiên bản tổng quát hơn của cùng một câu hỏi (với câu trả lời): How to add a default include path for gcc in linux?

+1

Lưu ý: Gần đây tôi đã phát hiện ra rằng 'dir_config' chỉ hoạt động không nhất quán. Nó có thể làm việc với mysql, nhưng không phải với ATLAS vì một lý do nào đó. –

+0

Cảm ơn bạn, điều này đã giúp tôi rất nhiều –

Các vấn đề liên quan