将静态库(libssh.a)与链接库(link)连接起来。

5
我正在尝试将我的程序与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 中来链接动态库,但是当我执行 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
@joyallen,它们都导致相同的错误,您有任何想法为什么在我的克隆存储库路径生成错误吗?谢谢。 - NoobieG
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接