связать libssh со статической библиотекой (libssh.a) - PullRequest
0 голосов
/ 28 июня 2018

Я пытался связать свою программу со статической библиотекой libssh.

Ниже приведен мой простой код, скопированный из руководства по libssh:

//sshtest.c
#define LIBSSH_STATIC 1
#include <libssh/libssh.h>
#include <stdlib.h>

int main()
{
  ssh_session my_ssh_session;
  my_ssh_session = ssh_new();
  if (my_ssh_session == NULL)
    exit(-1);

  ssh_free(my_ssh_session);
}

Я поместил библиотечный файл libssh.a в подкаталог libs/

Затем скомпилируйте его командой gcc sshtest.c -Llibs -lssh -o sshtest

Вывод - куча неопределенных ошибок ссылок, таких как:

libs/libssh.a(wrapper.c.o): In function `crypto_free':
/home/gg/libssh/src/wrapper.c:156: undefined reference to `BN_clear_free'
/home/gg/libssh/src/wrapper.c:157: undefined reference to `BN_clear_free'
libs/libssh.a(libcrypto.c.o): In function `ssh_reseed':
/home/gg/libssh/src/libcrypto.c:77: undefined reference to `RAND_add'
libs/libssh.a(libcrypto.c.o): In function `sha1_init':
/home/gg/libssh/src/libcrypto.c:84: undefined reference to `EVP_MD_CTX_new'

Проблема может быть решена путем копирования файлов динамической библиотеки (libssh.so, libssh.so.4, libssh.so.4.5.0) в папку libs/, но я предполагаю, что компилятор свяжется с динамической библиотекой в ​​этом случае.

Может кто-нибудь сказать мне, как правильно связать статическую библиотеку libssh? Спасибо !!

Нечто дополнительное (необязательно):

На самом деле, я пытался создать приложение ssh-сервера с использованием includeOS, я пытаюсь связать с ним динамическую библиотеку, добавив target_link_libraries в cmakelist.txt, и я получил ошибку usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib", когда я make , Я думаю, может быть, Unikernel не может поддерживать динамическое связывание, потому что includeOS имеет только одну статическую переменную пути libray в cmakelist

---------------------- Редактировать ------------------------ --------

Одно из сообщений об ошибке:

`/home/gavin/libssh/src/wrapper.c:156: undefined reference to `BN_clear_free'`

wrapper.c, строка 156:

  bignum_free(crypto->e);

это было определено в libssh/libcrypto.h, которое включает wrapper.h

libcrypto.h, строка 70: ​​

#define bignum_free(num) BN_clear_free(num)

И я замечаю, что void BN_clear_free(BIGNUM *a); - это функция, определенная в библиотеке openssl

Может ли введение другой библиотеки вызвать проблему? если так, как я мог это исправить? почему при динамическом связывании дозы нет этой проблемы?

...