2012-02-16 35 views
7

Tôi đã cài đặt một số thư viện gốc trong/usr/local/lib.Làm cách nào để Ruby tìm một thư viện gốc?

Tôi hiện đang cố gắng cài đặt một viên đá quý cần những thứ này để xây dựng một cách chính xác nhưng, việc xây dựng đá quý không thành công vì nó không thể tìm thấy thư viện .

Tệp extconf.rb của đá quý cố gắng xác nhận nó có thể tìm thấy thư viện với have_library() nhưng điều này không thành công vì một số lý do.

tôi đã cố gắng thiết lập một loạt các biến môi trường nhưng không có vẻ làm việc:

irb(main):003:0> require 'mkmf' 
=> true 
irb(main):004:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):005:0> ENV['LD_LIBRARY_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):006:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):007:0> ENV['DYLD_LIBRARY_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):008:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):009:0> have_library('libgecodesearch') 
checking for main() in -llibgecodesearch... no 
=> false 
irb(main):010:0> ENV['C_INCLUDE_PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):011:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 
irb(main):012:0> ENV['PATH']='/usr/local/lib' 
=> "/usr/local/lib" 
irb(main):013:0> have_library('gecodesearch') 
checking for main() in -lgecodesearch... no 
=> false 

cách tốt nhất để giải quyết vấn đề này là gì?

+0

Tôi chưa bao giờ gặp phải tình huống này trực tiếp, nhưng tôi giả định rằng nếu bạn thêm đường dẫn đến '$ LOAD_PATH' (còn được gọi là '$:') tất cả sẽ hoạt động: '$: <<"/usr/local/lib/mylib "' Hoặc, hãy gọi trình thông dịch Ruby với một hoặc nhiều ['-I'] (http: // www Tùy chọn .zenspider.com/Languages ​​/ Ruby/QuickRef.html # command-line-options): 'ruby -I/usr/local/lib/mylib foo.rb' – Phrogz

+0

Thật không may, không, đó không phải là trường hợp 'irb (chính): 001: 0> yêu cầu 'mkmf'' ' => true' ' irb (chính): 002: 0> $: << "/ usr/local/lib" ' ' => ["/usr/pkg/lib/ruby/site_ruby/1.9", "/usr/pkg/lib/ruby/site_ruby/1.9/i386-netbsdelf", "/ usr/pkg/lib/ruby ​​/ site_ruby "," /usr/pkg/lib/ruby/vendor_ruby/1.9 "," /usr/pkg/lib/ruby/vendor_ruby/1.9/i386-netbsdelf ","/usr/pkg/lib/ruby ​​/ vendor_ruby "," /usr/pkg/lib/ruby/1.9 "," /usr/pkg/lib/ruby/1.9/i386-netbsdelf ","/usr/local/lib ","/usr/local/lib "]' 'irb (chính): 003: 0> have_library (' gecodesearch ') ' kiểm tra chính() trong -lgecodesearch ... no => false' –

+0

Không thêm thư mục gốc của '/ usr/local/lib' vào đường dẫn tải, tải thư mục/thư mục thực sự của librari es bạn cần. Ruby không tìm kiếm theo thứ bậc tất cả các thư mục bên dưới các thư mục trong đường dẫn tải. – Phrogz

Trả lời

2

Tôi đã đọc các nhận xét và tôi biết bạn đã làm cho nó hoạt động, nhưng tôi nghĩ rằng tôi có giải pháp thích hợp cho vấn đề.

have_library kiểm tra xem có thể sử dụng thư viện đã cho trong môi trường của bạn hay không. Nó làm như vậy bằng cách bao gồm tiêu đề thư viện và sử dụng một trong các hàm của nó trong một tệp nguồn C tạm thời. Nếu thành công thì thư viện phải có sẵn.

have_library 'geocodesearch' 
checking for main() in -lgecodesearch... no 

have_library không thể sử dụng các main chức năng từ geocodesearch. Điều này có nghĩa là thư viện không có sẵn hoặc chức năng không tồn tại. Trong trường hợp của bạn, nó có lẽ là sau này.

Bạn có thể yêu cầu have_library có chức năng để thử bằng cách chuyển đối số thứ hai. Ví dụ:

have_library 'geocodesearch', 'geocodesearch_version' 
checking for geocodesearch_version() in -lgecodesearch... 

Nếu bạn không chỉ định, nó sẽ chỉ tìm kiếm hàm main. Bạn cũng có thể chỉ định các tiêu đề được đưa:

have_library 'geocodesearch', 'geocodesearch_version', %w(geocode/search.h) 

Trong những ý kiến, bạn nói bạn giải quyết vấn đề của bạn bằng cách đơn giản loại bỏ sự have_library cuộc gọi. Đây là giải pháp được bản địa hóa; bạn sẽ phải áp dụng lại nó cho bất kỳ phiên bản mới của đá quý.

Tôi khuyên bạn nên gửi yêu cầu kéo tới tác giả chứa các điều chỉnh cần thiết. Lỗi này sẽ được sửa vĩnh viễn và bạn cũng sẽ giúp những người khác có thể gặp vấn đề tương tự.

mkmf tham khảo:

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