使用静态库(libssh.a)链接libssh

问题描述 投票:0回答:1

我正在尝试将程序与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"时出现错误make。我猜可能是unikernel无法支持动态链接,因为includeOS在cmakelist中只有一个静态libray路径变量。

----------------------编辑------------------------- -------

错误信息之一:

`/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库中定义的函数

可以引入另一个库引起问题吗?如果是这样,我该如何解决?为什么动态链接没有这个问题?

我正在尝试将程序与libssh静态库链接。以下是我从libssh教程复制的简单代码://sshtest.c #define LIBSSH_STATIC 1 #include #include&...

c compiler-errors static-linking libssh
1个回答
0
投票
  1. 安装libssl-devcmake,如果还没有安装,还可以安装其他dependencies
© www.soinside.com 2019 - 2024. All rights reserved.