我试图将程序与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库中定义的函数引入另一个库会引起问题吗?
如果是这样,我该如何解决?
为什么动态链接没有这个问题?
最佳答案
libssl-dev
,cmake
和其他一些dependencies,请安装它们。 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
编译代码大概您需要将源中的包含顺序更改为1)stdlib.h,stdio.h等,2)libssh/libssh.h。
并删除
#define LIBSSH_STATIC 1
关于c - 将libssh与静态库(libssh.a)链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51074521/