我试图将我的程序与 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 静态库的正确方法吗?谢谢 !!
额外的东西(可选):
实际上,我试图使用 includeOS 构建一个 ssh 服务器应用程序,我尝试通过添加来链接动态库target_link_libraries
进入cmakelist.txt
,我得到了一个错误usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib"
when I make
它。我猜可能是unikernel不支持动态链接,因为includeOS在cmakelist中只有一个静态libray路径变量
- - - - - - - - - - - 编辑 - - - - - - - - - - - - - - -----
错误信息之一:
`/home/gavin/libssh/src/wrapper.c:156: undefined reference to `BN_clear_free'`
包装器.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库中定义的函数
引入另一个库会导致问题吗?
如果是这样,我该如何解决它?
为什么动态链接没有这个问题?