SLAM进阶(九)---- cannot open shared object file问题

news2024/11/18 21:29:09

1 为什么会遇到这个问题

        我们在

2 查看问题所在

        我的项目依赖于VTK 7.1.1,PCL 1.9.1。项目可以完成编译,但是不能执行。即使用动态库编译链接stereo_inertial_tum_vi_old.cc后,得到名为stereo_inertial_tum_vi_old的可执行程序。但是在运行stereo_inertial_tum_vi_old可执行程序时,程序报错。问题如下:

        但是我们寻找一下这个动态链接库:

sudo updatedb
locate libvtkCommonMisc-7.1.so.1

        我们发现是有这个库文件的。

        首先利用ldd命令查看一下stereo_inertial_tum_vi_old的动态库依赖关系:

        结果如下图所示,可以看到,动态库libvtk很多都没有被找到。

        至于找不到的情况分为两种:

  • 系统里根本不存在这些库;
  • 这些库在系统中存在,但是ld-linux.so找不到,即libxxx.so库的位置没有告知ld-linux.so。

        由于动态库是自己刚刚创建好的,因此属于第二种情况。

        我们知道,只要把动态库libvtk*.so的绝对路径添加到动态载入器ld-linux.so的搜索路径中,那么动态载入器就可以获取到动态库libcalc.so的绝对路径,接着就可以找到动态库文件libcalc.so,将动态库文件载入内存,然后就可以使用动态库里面的代码,最终可执行程序stereo_inertial_tum_vi_old就可以成功运行,不会报错。

        动态载入器搜索动态库绝对路径的搜索顺序为:DT_RPATH段→环境变量LD_LIBRARY_PATH
→/etc/ld.so.cache文件列表→/lib/或/usr/lib目录

        因此,添加动态库绝对路径的方法也有很多种

        接下来,我们就按照上述分析进行操作。

3 解决问题

3.1 将动态库绝对路径添加至环境变量LD_LIBRARY_PATH

        首先进入存放动态库的文件夹内,然后输入如下命令,获取动态库libvtk*.so的绝对路径,然后复制此绝对路径。

        因此我们看看缺少库的路径:

	libvtkCommonMisc-7.1.so.1 => not found
	libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f7d166ed000)
	libvtkCommonTransforms-7.1.so.1 => not found
	libvtkCommonSystem-7.1.so.1 => not found
	libvtkzlib-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found
	libvtkCommonSystem-7.1.so.1 => not found
	libvtkCommonTransforms-7.1.so.1 => not found
	libvtkDICOMParser-7.1.so.1 => not found
	libvtkmetaio-7.1.so.1 => not found
	libvtkpng-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found
	libvtktiff-7.1.so.1 => not found
	libvtkzlib-7.1.so.1 => not found
	libvtkCommonMath-7.1.so.1 => not found
	libvtkjpeg-7.1.so.1 => not found
	libvtkCommonTransforms-7.1.so.1 => not found
	libvtkCommonMath-7.1.so.1 => not found
	libvtkzlib-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found
	libvtkCommonMisc-7.1.so.1 => not found
	libvtkCommonTransforms-7.1.so.1 => not found
	libvtkCommonMisc-7.1.so.1 => not found
	libvtkCommonSystem-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found
	libvtkCommonMath-7.1.so.1 => not found
	libvtksys-7.1.so.1 => not found

        应该都是在一个文件夹下面的,我们选择第一个动态链接库:

        locate libvtkCommonMisc-7.1.so.1

liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:~/Desktop/orb_slam3-master$ locate libvtkCommonMisc-7.1.so.1
/bag/VTK-7.1.1/build/lib/libvtkCommonMisc-7.1.so.1
/home/liuhongwei/Desktop/vtk7.1.1/lib/libvtkCommonMisc-7.1.so.1
/usr/local/lib/libvtkCommonMisc-7.1.so.1

        我们进入/usr/local/lib下面:输入pwd获得当前的绝对路径:

liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ pwd
/usr/local/lib

        然后输入如下命令,将动态库绝对路径添加至环境变量LD_LIBRARY_PATH中:

liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

        输入完上述命令后,输入echo命令检查一下环境变量LD_LIBRARY_PATH的值。

echo $LD_LIBRARY_PATH
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ echo $LD_LIBRARY_PATH
/opt/ros/melodic/lib:/usr/local/cuda-11.6/lib64:/usr/local/lib

        可见动态库的绝对路径已经成功添加至环境变量LD_LIBRARY_PATH中了。

        最后再使用ldd命令查看一下stereo_inertial_tum_vi_old的动态库依赖关系,如下图所示,此时动态载入器就可以获取到动态库libtk*.so的绝对路径了。接下来就可以找到动态库文件libtk*.so,然后将动态库文件载入内存,接着就可以使用动态库里面的代码,最终可执行程序stereo_inertial_tum_vi_old就可以成功运行了。

        运行成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪些企业适合做私域?私欲怎么做成效大?

什么是私欲 简单直白来说,就是不用花钱就可以触达客户的渠道。私域流量就是私人的流量(不用花钱)。 哪些企业适合做私域? 》复购率高 比如美妆护肤产品行业、餐饮等快消品行业。 可通过群发推广消息、朋友圈营销和在社群里不断进…

Breach 1.0 靶机

Breach 1.0 环境配置 设置 VMware 上的仅主机模式网卡,勾选 DHCP 自动分配 IP,将子网改为 192.168.110.0/24 将靶机和 kali 连接到仅主机网卡 信息搜集 存活检测 详细扫描 后台网页扫描 网页信息搜集 Initech被入侵,董事会投票决定引入…

二、UI入门

1. QWidget类 QWidget类是Qt所有图形用户界面(组件)的基类,因此QWidget类内部规定了所有最基础的UI相关功能。例如以下成员: ● width : const int 宽度(单位:像素,后文同) Qt中的…

基于SegFormer的改进语义分割该网络

摘要 场景解析是无人驾驶领域的一个关键任务,但是传统的语义分割网络往往只关注于提取更深层次的图像语义信息而忽略了全局信息对图像分割任务的重要性。另外随着图像在深层次卷积网络中的传递,卷积核天然的滤波作用会使得图像的边缘趋于平滑而丢失细节特…

2015年408真题复盘

紫色标记是认为有一定的思维难度或重点总结 红色标记是这次刷真题做错的 记录自己对题目的一些想法与联系,可能并不太关注题目本身。 分数用时 选择部分10/21 78/8036min大题部分总分 摘自知乎老哥:“我做历年真题时,绝大部分是130~139&#…

LVS负载均衡集群 (NAT模式)

LVS集群 集群的概念: 为解决某个特定的问题,将多个计算机组合起来形成一个单个系统 集群的水平扩展: 增加设备,并行运行多个服务,通过网路连接和算法来调度服务分配的问题 集群的类型: 负载均衡集群&#…

【斗罗二】冰帝两次险些杀死雨浩,天梦哥求助伊老遭拒绝,霍云儿现身救儿子

Hello,小伙伴们,我是小郑继续为大家深度解析绝世唐门。 斗罗大陆动画第二部绝世唐门已经更新了,霍雨浩与冰帝完美融合,成功觉醒了第二武魂,霍挂的时代正式到来。只是在整个第19集中,官方做了大量的改编,不但…

有湖有仓,如何升级到湖仓一体

很多企业在过去的 IT 基础建设过程中,都已经搭建了数据仓库或数据湖,或者两者都有。其中数据仓库一般使用的是传统 Oracle 或者传统 MPP 数据库,如 Teradata 和 Greenplum,数据湖使用 Hadoop 大数据平台。所以在考虑湖仓一体升级改…

ps插件Coolorus for Mac中文激活版

Coolorus是一款非常实用的Photoshop插件,它为Photoshop增加了色环配色面板,让设计师可以更直观地选择颜色。同时,Coolorus还提供了多种专业配色方案,如鲜艳色、复古色、日常色等,设计师可以直接套用这些方案&#xff0…

Power BI 傻瓜入门 1. 数据分析术语:Power BI风格

本章内容包括: 了解Power BI可以处理的不同类型的数据了解您的商业智能工具选项熟悉Power BI术语 数据无处不在。从你醒来的那一刻到你睡觉的时候,某个系统会代表你收集数据。即使在你睡觉的时候,也会产生与你生活的某些方面相关的数据。如…

计算机网络的七层结构、五层结构和四层结构

为什么要分层: 这个就和我们平常写程序一样,高内聚、低耦合。将网络进行分层我们就可以根据每一层的功能分开开发设计,将复杂的网络问题分解为更简单和清晰的小问题,方便设计、实现和标准化。无需在意其他层是如何实现的&#xff…

【框架源码篇 04】Spring源码手写篇-Bean定义配置化

Spring源码手写篇-Bean定义配置化 一、Bean定义配置分析 我们前面实现了手写IoC和AOP的功能,但是我们在使用的时候发现我们的调用代码还是非常的繁琐,会给应用者很不好的体验。 上面的代码很直观的看到重复代码很多,要用户设置的内容也很多&…

基于springboot实现学生综合测评系统项目【项目源码+论文说明】

基于springboot实现学生综合测评系统演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,学生综合测评系统也不例外,但目前国内仍都使用人工管理,学校规模越来越大,同时信息量也越来越庞大,人…

运营商大数据精准营销,击碎你的固化营销思维

大数据精准营销服务是大数据应用的典型场景之一,也是依托大数据和互联网提升企业效率的一种有效手段。但是,在选择大数据服务的很多时候,企业往往要考虑法律与合规的问题,其中比较重要的是数据获取渠道与数据是否脱敏。在所有大数…

CSS 两栏布局

目录 CSS两栏布局(左列定宽,右列自适应宽) 方法一:浮动margin 方法二:定位margin 方法三:浮动BFC 方法四:Flex布局 方法五:able布局 CSS两栏布局(左列不定宽&#…

一、Qt简介

1. 什么是Qt? Qt是一个基于C的图形用户界面(GUI)开发框架,但图形用户界面并不是Qt的全部,因为Qt还包含了很多非图形化的开发功能:多线程、数据库、图像图形处理、音视频处理、网络通信、文件IO等。 一方面…

【智慧工地源码】基于AI视觉技术赋能智慧工地

伴随着技术的不断发展,信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升,智慧工地概念应运而生,庞大的建设规模催生着智慧工地的探索和研发。 建筑施工具有周期长、环境复杂、工序繁杂、人员流动性大等特点,所以…

10个基于.Net开发的Windows开源软件项目

分享10个适合程序员的神器,都是基于.Net开发的,可以用来学习,日常工作也可以使用。(点击标题,查看详情) 1、基于.NET的强大文件格式开源转换工具 一个基于.NET平台的开源文件格式转换工具,可以…

仿写el-upload组件,彻底搞懂文件上传

用了那么久的Upload组件,你知道是怎么实现的么,今天就来仿写一个饿了么el-upload vue组件,彻底搞懂前端的文件上传相关知识! 要实现的props 参数说明action必选参数,上传的地址headers设置上传的请求头部multiple是否…

Linux内存管理(2):memblock

一、memblock分配器初始化 在内核初始化过程中也需要分配内存,使用的页帧分配器叫memblock(早期的内核版本使用BootMem,新版本内核已不再用)。 memblock是系统启动过程中的一个中间阶段的内存管理, 负责在系统上电到内核内存管理模型初始化之前这段时间的物理内存分配、预留…