Я пытался связать свою программу со статической библиотекой 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
Может ли введение другой библиотеки вызвать проблему?
если так, как я мог это исправить?
почему при динамическом связывании дозы нет этой проблемы?