我正在尝试将我的程序与libssh静态库链接起来。
以下是我从libssh教程中复制的简单代码:
我把库文件
然后使用命令
输出的结果是一堆未定义的引用错误,例如:
问题可以通过将动态库文件 (
有人能告诉我连接 libssh 静态库的适当方法吗?谢谢!!
额外信息(可选):
实际上,我正在尝试使用 includeOS 构建一个 ssh 服务器应用程序,我尝试通过将
编辑:错误消息之一:
以下是我从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
中来链接动态库,但是当我执行 make
时出现错误 usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib"
。我猜想可能是 unikernel 不支持动态链接,因为 includeOS 只有一个静态库路径变量在 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库中定义的一个函数。
引入另一个库会导致问题吗? 如果是这样,我该如何解决? 为什么动态链接没有这个问题?
gcc sshtest.c -Llibs -lssh -static -o sshtest
或者gcc sshtest.c libs/libssh.a -o sshtest
。 - Joy Allen