如何让Ruby找到一个本地库?[英] How to get Ruby to find a native lib?

本文是小编为大家收集整理的关于如何让Ruby找到一个本地库?的处理方法,想解了如何让Ruby找到一个本地库?的问题怎么解决?如何让Ruby找到一个本地库?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在/usr/local/lib 中安装了一些本地库.

我现在正在尝试安装一个需要这些的 gem,以便正确构建,但是 gem 构建失败,因为它找不到图书馆.

gem 的 extconf.rb 文件试图确认它可以找到库have_library() 但由于某种原因失败了.

我尝试设置一堆环境变量,但似乎没有任何效果:

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 

解决这个问题的最佳方法是什么?

推荐答案

我已经阅读了评论,我知道你做到了,但我认为我有适当的解决方案.

have_library 检查是否可以在您的环境中使用给定的库.它通过包含库头文件并在临时 C 源文件中使用其函数之一来实现这一点.如果成功,则该库必须可用.

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

have_library 无法使用 geocodesearch 中的main 函数.这意味着该库不可用或该函数不存在.在你的情况下,可能是后者.

您可以通过传递第二个参数来告诉 have_library 要尝试哪个函数.例如:

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

如果你不指定,它只会寻找 main 函数.您还可以指定要包含的标题:

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

在评论中,您说您通过简单地消除 have_library 调用解决了您的问题.这是一个本地化的解决方案;您必须将其重新应用到任何新版本的 gem.

我建议向作者发送包含必要调整的拉取请求.该错误将被永久修复,您还将帮助可能遇到相同问题的其他人.

mkmf参考:

本文地址:https://www.itbaoku.cn/post/786607.html