从Ruby使用Aerospike时出现GENERAL_NAME_free

时间:2017-03-28 22:54:53

标签: ruby ffi aerospike ruby-ffi

我正在尝试创建一个简单的共享库libfoo.so,它使用单个函数打开与Aerospike服务器的连接,等待3秒钟并关闭连接。 libfoo.so只有一个函数open_then_close(char* host, int port)

然后我想使用FFI从Ruby调用这个函数:

require 'ffi'

module Aerospike
  extend FFI::Library
  ffi_lib  "./libfoo.so", "libaerospike.so"
  attach_function :connect_then_close, [:string, :int], :int
end

puts Aerospike.connect_then_close("127.0.0.1", 3000)  

我使用C程序测试foolib.so,它运行正常。但是,当我尝试运行上面的代码时,我收到以下错误:

Could not open library '/usr/lib/libaerospike.so': /usr/lib/libaerospike.so: undefined symbol: GENERAL_NAME_free (LoadError)

其他信息:

$ ldd /usr/lib/libaerospike.so
    linux-vdso.so.1 =>  (0x00007ffe413cb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ec87a3000)
    /lib64/ld-linux-x86-64.so.2 (0x00005645069a7000)

$ nm -u /usr/lib/libaerospike.so | grep GENERAL_NAME_free
       U GENERAL_NAME_free

知道出了什么问题吗?

更新

$ dpkg -l | grep libgcrypt
  ii  libgcrypt11:amd64       1.5.3-2ubuntu4.3        amd64        LGPL Crypto library - runtime library

$ locate libcrypto
  /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
  /usr/lib/x86_64-linux-gnu/libcrypto.a
  /usr/lib/x86_64-linux-gnu/libcrypto.so
  /usr/lib/x86_64-linux-gnu/pkgconfig/libcrypto.pc

这就是我编译和创建libfoo.so

的方法
$ gcc -Wall -c -fPIC foo.c -o foo.o -laerospike -lssl -lcrypto -lpthread -lm -lz

链接错误的方式:

$ gcc -shared -o libfoo.so foo.o

1 个答案:

答案 0 :(得分:2)

看起来符号GENERAL_NAME_free是由OpenSSL的加密库根据此man page和此OpenSSL forum post定义的。所以你可能错过了libcrypto库。

但我很好奇,为什么你使用Aerospike C客户端库来代替你的Ruby程序而不是Aerospike Ruby client?在Ruby客户端中是否缺少C客户端中的某些特定功能?