如何让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无法使用 have_librarymain函数。 这意味着库不可用或function不存在。 在你的情况下,它可能是后者。

您可以通过传递第二个参数来告诉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参考:

  • 源代码
  • 文档