我正在尝试使用 Ruby 的 FFI 附加到 Google cityhash gem;它是一个 64 位和 128 位的非加密散列,类似于默认的 Ruby 散列函数 (murmur_hash 1),但更新了一点,更重要的是,它允许在散列上设置种子。
我在我的 Mac 上安装了 cityhash 以/usr/local/lib
使用默认值。./configure
这将一些库放置在/usr/local/lib
:
-rwxr-xr-x 1 root wheel 13720 Jul 11 15:16 /usr/local/lib/libcityhash.0.dylib
-rw-r--r-- 1 root wheel 43424 Jul 11 15:16 /usr/local/lib/libcityhash.a
lrwxr-xr-x 1 root wheel 19 Jul 11 15:16 /usr/local/lib/libcityhash.dylib -> libcityhash.0.dylib
-rwxr-xr-x 1 root wheel 977 Jul 11 15:16 /usr/local/lib/libcityhash.la
我正在使用 Mac OS X。gcc 版本是 4.6,这不是默认的 Mac gcc,但我也尝试过。
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0]
ffi(在mac上安装了默认gcc,gcc 4.6不起作用?)
我做了我能做的最简单的模块:
require 'ffi'
module MyCityHash
extend FFI::Library
ffi_lib 'cityhash'
attach_function :CityHash64, [:string, :size_t], :uint64
end
但是当我尝试将此模块包含到任何 Ruby 类或脚本文件中时,我得到了错误:
/Users/charlesmartin/.rvm/gems/ruby-1.9.2-p180/gems/ffi-1.0.9/lib/ffi/library.rb:147:in `attach_function': Function 'CityHash64' not found in [libcityhash.dylib] (FFI::NotFoundError)
CityHash64 在 city.h 中有签名:
uint64 CityHash64(const char *buf, size_t len);
我将不胜感激有关如何调试此问题的任何见解。