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) 的相关文章

  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific

随机推荐