将 libssh 与静态库 (libssh.a) 链接

Noo*_*ieG 5 c compiler-errors static-linking libssh

我试图将我的程序与 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);
}
Run Code Online (Sandbox Code Playgroud)

我将库文件放入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'
Run Code Online (Sandbox Code Playgroud)

可以通过将动态库文件(libssh.so, libssh.so.4, libssh.so.4.5.0)复制到该libs/文件夹​​中来解决该问题,但我猜在这种情况下编译器将链接动态库。

有人可以告诉我链接 libssh 静态库的正确方法吗?谢谢 !!

额外的东西(可选):

实际上,我试图使用 includeOS 构建一个 ssh 服务器应用程序,我尝试通过添加target_link_libraries到 中来链接动态库,但当我这样做时cmakelist.txt出现错误。我猜可能是unikernel不支持动态链接,因为includeOS在cmakelist中只有一个静态libray路径变量usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib"make

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

错误信息之一:

`/home/gavin/libssh/src/wrapper.c:156: undefined reference to `BN_clear_free'`
Run Code Online (Sandbox Code Playgroud)

包装器.c,第 156 行:

  bignum_free(crypto->e);
Run Code Online (Sandbox Code Playgroud)

它被定义在libssh/libcrypto.h其中包括wrapper.h

libcrypto.h 第 70 行:

#define bignum_free(num) BN_clear_free(num)
Run Code Online (Sandbox Code Playgroud)

我注意到这void BN_clear_free(BIGNUM *a);是 openssl 库中定义的函数

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

小智 3

  1. 安装libssl-devcmake也许还有一些其他依赖项(如果您还没有)。
  2. 使用静态标志从源代码构建 libssh。

    • 例如提取libssh-0.9.3.tar.xz/home/user/libssh-0.9.3
    • cd /home/user/libssh-0.9.3
    • mkdir build && cd build
    • cmake ../ -DWITH_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF -DWITH_STATIC_LIB=ON
    • make
    • 现在你可以使用/home/user/libssh-0.9.3/build/src/libssh.a
  3. 编译你的代码gcc -I/home/user/libssh-0.9.3/include sshtest.c /home/user/libssh-0.9.3/build/src/libssh.a -lssh -lrt -lcrypto -lz -lpthread -ldl -o sshtest -static

  4. 您仍然会收到一些有关来自 glibc 的共享库的警告,但生成的二进制文件是完全静态的。

大概您需要将源代码中的包含顺序更改为 1) stdlib.h、stdio.h 等,2) libssh/libssh.h。并删除#define LIBSSH_STATIC 1