Ich versuche, Ruby's FFI zu verwenden, um die Google-Cityhash-Gem anhängen; Es ist ein 64-Bit und 128-Bit, nicht kryptografische Hash, ähnlich wie die Standard-Ruby-Hash-Funktion (murmur_hash 1), aber ist ein bisschen neuer, und, was noch wichtiger ist, ermöglicht die Einstellung der Seed auf den Hash.
Ich habe cityhash in /usr/local/lib
unter Verwendung der Standard ./configure
auf meinem Mac. Dadurch werden einige Bibliotheken in /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
Ich verwende Mac OS X. Die gcc-Version ist 4.6, die nicht die Standard-Mac-gcc ist, aber ich habe das auch versucht.
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0]
ffi (installiert mit Standard-gcc auf Mac, gcc 4.6 funktioniert nicht?)
Ich habe das einfachste Modul gebaut, das ich finden konnte:
require 'ffi'
module MyCityHash
extend FFI::Library
ffi_lib 'cityhash'
attach_function :CityHash64, [:string, :size_t], :uint64
end
aber wenn ich versuche, dieses Modul in eine Ruby-Klasse oder Skriptdatei einzubinden, erhalte ich die Fehlermeldung:
/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 hat die Signatur in city.h:
uint64 CityHash64(const char *buf, size_t len);
Ich wäre sehr dankbar für jeden Hinweis, wie man dieses Problem beheben kann.