symbol lookup error:undefined symbol: libssh2_init

来源:互联网 发布:k-means算法 编辑:程序博客网 时间:2024/06/05 18:30

今天执行一个程序,报这个错误,第一直觉是路径没设置好或libssh2动态链接库没装。经过一番详细的检查

[root@RedHatEL63x-001 /]# find / -name libssh*
/usr/lib64/libssh2.so.1
/usr/lib64/libssh2.so.1.0.1
/usr/share/doc/libssh2-1.2.2

找到了两个链接库,都在/usr/lib64/下。

执行了一下:

[root@RedHatEL63x-001 /]# export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH

[root@RedHatEL63x-001 /]# echo $LD_LIBRARY_PATH

再执行程序依旧不管用;

[root@RedHatEL63x-001 /]# ldconfig -v|grep libssh
 libssh2.so.1 -> libssh2.so.1.0.1

发现libssh2是已经安装好的了。而且 libssh2.so.1是一个软链接指向了libssh2.so.1.0.1。

[root@RedHatEL63x-001 lib64]# ls libssh* -alc -h
lrwxrwxrwx. 1 root root   16 Mar 12  2013 libssh2.so.1 -> libssh2.so.1.0.1
-rwxr-xr-x  1 root root 161K Jul 28 19:35 libssh2.so.1.0.1

同样发现 libssh2.so.1是一个软链接指向了libssh2.so.1.0.1,起作用的就是libssh2.so.1.0.1文件。

那么路径是设置好的,动态库也是配置好的,为什么libssh2_init符号就是找不到呢,这把我之前的推断都推翻了。

在网上寻找了大半天答案,都没找到能解决问题的。中文外文的技术博客都翻遍了,均无所获。万事只能靠自己了。

我在想是不是libssh2.so.1.0.1动态库文件里头根本就没有libssh2_init()函数呢,能有什么办法查看到整个动态库里头

有哪些函数名吗?比如像vc6自带的那个depend那样。后来我在网上以关键字libssh2_init进行查找,想知道它到底是

在什么动态库里有的玩意,找到了这样一个网页:

https://libssh2.org/libssh2_init.html。网页指明“Added in libssh2 1.2.5 ”这个函数是在libssh2动态库的V1.2.5里面新加

的,显然上面的V1.0.1版本的libssh2动态库是没有这个函数的。

其实我们可以用下面这样的命令来验证是不是有这样一个函数,nm -D 命令可以列出so文件的所有符号:

[root@RedHatEL63x-001 lib64]# nm -D libssh2.so.1.0.1 |grep init

                 U EVP_CIPHER_CTX_init
0000003770e1e3b0 T libssh2_knownhost_init
0000003770e10490 T libssh2_publickey_init
0000003770e145a0 T libssh2_session_init_ex
0000003770e16920 T libssh2_sftp_init

这里发现确实没有libssh2_init函数。

或者这样验证也是一样的:

[root@RedHatEL63x-001 lib64]# objdump -tT libssh2.so.1.0.1 |grep init
0000003770e04078 l    d  .init 0000000000000000              .init
0000000000000000      DF *UND* 0000000000000000              EVP_CIPHER_CTX_init
0000003770e145a0 g    DF .text 00000000000000a4  Base        libssh2_session_init_ex
0000003770e10490 g    DF .text 00000000000008fa  Base        libssh2_publickey_init
0000003770e16920 g    DF .text 0000000000000739  Base        libssh2_sftp_init
0000003770e1e3b0 g    DF .text 0000000000000042  Base        libssh2_knownhost_init


所以要解决这个问题必须下载V1.2.5以上版本的

libssh2动态库(下载地址:https://www.libssh2.org/),安装并配置好,另外需要将libssh2.so.1 文件软链接到高版本

的libssh2动态库文件。


有时候发现度娘再好,谷歌再棒,都抵不过自己爱探索的心!原创真迹,转载请注明!!!

https://www.libssh2.org/






0 0
原创粉丝点击