02-----libevent下载或者移植环境时报错(/usr/bin/ld: warning:xxx,needed by xxx,not found)

2023-11-18

这个问题/bin/sh:xx(命令) not found是非常常见的,更具体可以是下图的情况,两者是一样的。
在这里插入图片描述

1 我第一次遇到这种情况时,发现是库版本不对,所以将这些动态库换一篇后解决。

ln -s /usr/local/lib/libevent_core-2.1.so.7 /usr/lib64/libevent_core-2.1.so.7	//ln -s 源文件 目标文件。即将local下的源文件生成lib64的目标文件。

//剩余的libevent的库同理。共5个库替换完毕。
ln -s /usr/local/lib/libevent_extra-2.1.so.7 /usr/lib64/libevent_extra-2.1.so.7
ln -s /usr/local/lib/libevent_openssl-2.1.so.7 /usr/lib64/libevent_openssl-2.1.so.7
ln -s /usr/local/lib/libevent_pthreads-2.1.so.7 /usr/lib64/libevent_pthreads-2.1.so.7
ln -s /usr/local/lib/libevent-2.1.so.7 /usr/lib64/libevent-2.1.so.7

2 在另一台服务器部署时,第二次又遇到这种情况,首先想法当然是按照上面操作一篇,但是仍然不对,那么就理清一下思路咯,最终发现:实际上原因是CMakelist.txt链接库的时候,库路径写错了,本次libevent版本为2.12,但写成了之前用的2.11版本的路径,改一下路径即可。

3 链接不同的库时,版本冲突

在这里插入图片描述
这次又遇到了这个问题,原因是海康的SDK使用了openssl,版本是1.0.0,即图片后者,而libevent库也用到openssl,版本是1.1.1,即图片前者。查看方法如下:
海康的很简单,直接看目录里面即可。
在这里插入图片描述
而libevent由于是使用/etc/ld.so.conf的库路径方式,所以需要使用ldd查看链接的路径。

ldd /home/xxx/libevent-2.1.11-stable/lib/libevent_openssl.so

可以看到,libevent确实是使用了1.1版本的openssl,与海康的版本冲突。
在这里插入图片描述
解决:由于目前程序能正常运行,这个警告可以忽略,想要解决的话,需要把两者的库换成统一。
注意:
1和3的问题前面是一样,但是后面是不一样的,前者是not found,后者是may conflict。

4 库路径对了,但是链接时动态库的路径并未包含在环境变量

本例子即下面总结的第3点。下面来拿具体的例子解析,因为这种情况遇到的次数非常频繁,即当出现下图的(当然,有可能不是这种情况导致下面的问题,如果使用了这个方法还是出现问题,那么需要按照下面的总结去一个个排查)。
在这里插入图片描述

  • 1)出现该问题,首先我们执行下面的ld命令,查看该可执行程序差哪些动态库没有链接进去。如果没有链接进去,那么就会出现not found。-d可以去掉,DHDVR为生成的可执行程序。
#好像可以使用  "LD_DEBUG=libs 可执行程序名路径 -v" 代替下面的ldd命令,它的意思是:跟踪可执行程序需要的所有加载库文件的路径。
[tyy@node01]$ ldd -d DHDVR
   libc.so.6 => /usr/lib64/libevent_core-2.1.so.7 (0xc3122000) 
   libpthread.so.0 => /usr/lib64/libpthread.so.0 (0xb7522000) not found
   /lib/ld-linux.so.2 (0xb771a000)

或者使用带筛选的命令。

ldd -d DHDVR | grep "*not found*"
  • 2)找到没有链接进去的动态库后,找到该动态库的路径,在vim ld.so.conf这个文件中添加链接路径(也可以通过添加环境变量的方法处理),然后执行以下命令更新。
ldconfig	/etc/ld.so.conf	//更新配置

这样就搞掂了。

这里的还可能出现类似的这种问题,例如:

/tyy/myproject/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

同样需要使用到ldd这个命令,解决方法参考我的这篇下载openssl的文章。

https://blog.csdn.net/weixin_44517656/article/details/112762604

5 部署的环境没有切换

例很不巧,我又遇到这个问题了,原因是部署到其它机器时,环境没有切换。例如我本来是在docker里面编译好并且能运行的,然后部署到新的机器的时候,忘记切换到docker环境,导致找不到对应的ssl版本,所以就报错了。

在这里插入图片描述
解决:输入docker命令进入docker即可解决。例如:

docker exec -i -t --privileged=true docker_centos_gw bash

6 总结可能出现这种情况的原因

1)要么是软链接问题;
2)要么是库路径没写对;
3)要么是库路径也对了,但是链接时仍需vim ld.so.conf,然后更新ldconfig;
4)要么是没有该库,需要安装。
5)要么是版本不对,导致上面第4、第5点的问题。
例如版本不对的软链接也不对,或者版本不对导致路径名不一样,或者部署的环境没有切换导致版本出现问题,
这些我都试过了。第345点一般是安装时遇得多。
并且这里注重强调一下:部署的环境必须记得切换,我老是忘记。

至此,对于出现not found的问题总结完毕。

上面执行 "LD_DEBUG=libs 可执行程序名路径 -v"命令的结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02-----libevent下载或者移植环境时报错(/usr/bin/ld: warning:xxx,needed by xxx,not found) 的相关文章

随机推荐