link 带有静态库的 libssh (libssh.a)
link libssh with static library (libssh.a)
我试图 link 我的程序使用 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/
文件夹中来解决这个问题,但我猜编译器在这种情况下会link使用动态库。
有人能告诉我 link libssh 静态库的正确方法吗?谢谢!!
额外的东西(可选):
实际上,我试图使用 includeOS 构建一个 ssh 服务器应用程序,我尝试通过将 target_link_libraries
添加到 cmakelist.txt
中来 [=65=] 动态库,我得到了一个当我 make
时出现错误 usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib"
。我猜可能是 unikernel 不支持动态 linking,因为 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 库
中定义的一个函数
引入另一个库会导致问题吗?
如果是这样,我该如何解决?
为什么动态 linking 没有这个问题?
- 安装
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
我试图 link 我的程序使用 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/
文件夹中来解决这个问题,但我猜编译器在这种情况下会link使用动态库。
有人能告诉我 link libssh 静态库的正确方法吗?谢谢!!
额外的东西(可选):
实际上,我试图使用 includeOS 构建一个 ssh 服务器应用程序,我尝试通过将 target_link_libraries
添加到 cmakelist.txt
中来 [=65=] 动态库,我得到了一个当我 make
时出现错误 usr/bin/ld unrecognized option "-Wl,-rpath,path_to_my_sshlib"
。我猜可能是 unikernel 不支持动态 linking,因为 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 库
引入另一个库会导致问题吗? 如果是这样,我该如何解决? 为什么动态 linking 没有这个问题?
- 安装
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