Ошибка GENERAL_NAME_free при использовании Aerospike от Ruby

Я пытаюсь создать простую общую библиотеку libfoo.so который открывает соединение с сервером Aerospike с помощью одной функции, ждет 3 секунды и закрывает соединение. libfoo.so имеет единственную функцию open_then_close(char* host, int port),

Затем я хочу вызвать эту функцию из Ruby, используя FFI:

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)  

Я проверял foolib.so с помощью программы на C все работает нормально. Однако, когда я пытаюсь запустить приведенный выше код, я получаю следующую ошибку:

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 ответ

Похоже на символ GENERAL_NAME_free определяется крипто-библиотекой OpenSSL в соответствии с этой страницей руководства и данным сообщением на форуме OpenSSL. Так что вы, вероятно, скучаете по библиотеке libcrypto.

Но мне любопытно, почему вы используете клиентскую библиотеку Aerospike C для своей программы Ruby вместо использования клиента Aerospike Ruby? Есть ли какая-то конкретная функциональность в клиенте C, которая отсутствует в клиенте Ruby?

Другие вопросы по тегам