我在/ 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
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?
首先添加find_library对我有用的:
find_library('library_name', 'library_function', '/usr/local/lib')
have_library('library_name', 'library_function', 'library_header')
Run Code Online (Sandbox Code Playgroud)
我在尝试构建一个依赖于/usr/local/libTruffleRuby 21.3.0 下的自定义库的本机扩展 gem 时遇到了这个问题,而相同的 gem 在 CRuby 2.7.x 下工作得很好。
根据mkmf MakeMakefile 文档,似乎find_library将接受搜索路径列表,并have_library检查标头,但由于某种原因have_library不接受搜索路径。但是,find_library会将它找到的路径添加到内部搜索路径中,然后have_library就能找到该库。
您可能只使用 就可以逃脱惩罚find_library,但我同时执行这两种操作have_library,因为据我了解,也可以查找库标头。
以下是我从编译命令中看到的错误消息graalvm-native-clang -o conftest,以供将来的搜索者参考:
conftest.c:14:57: error: use of undeclared identifier 'library_function'
int t(void) { void ((*volatile p)()); p = (void ((*)()))library_function; return !p; }
Run Code Online (Sandbox Code Playgroud)
ld.lld: error: unable to find library -llibrary_name
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)