gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:40:51 25 4
gpt4 key购买 nike

我试图将我的程序与 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 中只有一个静态库路径变量

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

错误消息之一:
`/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 库中定义的函数

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

最佳答案

  • 安装 libssl-dev , cmake或许还有一些其他的dependencies如果你还没有它们。
  • 使用静态标志从源代码构建 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
  • 使用 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 编译您的代码
  • 您仍然会从 glibc 中收到一些关于共享库的警告,但生成的二进制文件是完全静态的。

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

    关于c - 将 libssh 与静态库 (libssh.a) 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51074521/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com