error while loading shared libraries 找不到动态库问题如何解决

在使用 c 或 c++ 开发应用时,在启动程序时,有时会遇到这个错误,找不到动态库。这个时候,我们使用 ldd 来查看,发现可执行文件依赖的动态库显示为 not found。

1 实验代码

使用如下 3 个文件做实验。

hello.h 中声明了函数 say_hello()。

hello.c 中实现了函数 say_hallo(), 在函数中打印 hello,hello.c 编译出一个动态库。

main.c 中调用 hello.c 中的函数 say_hello(),main.c 编译出可执行文件。

hello.h:

void say_hello();

hello.c

#include <stdio.h>
#include "hello.h"void say_hello() {printf("hello\n");
}

main.c

#include "hello.h"int main() {say_hello();return 0;
}

使用 gcc -fPIC -shared hello.c -o libhello.so 编译出动态库,使用 gcc main.c libhello.so 编译可执行文件,编译之后的文件目录如下,libhello.so 是动态库,a.out 是可执行文件。

这个时候直接执行 a.out 却无法执行,打印错误信息是找不到动态库。

除了使用 ldd 查看文件依赖的动态库之外,还可以使用 objdump 或 readelf 来查看可执行文件依赖的动态库。

objdump -x a.out |grep NEED

readelf -d a.out |grep NEED

2 动态库路径配置

有几种方式可以配置动态库的路径,这几种方式都是可行的,其中 LD_LIBRARY_PATH 是工作中最常使用的。

2.1 LD_LIBRARY_PATH 

工作中,我们常用的是设置一个环境变量 LD_LIBRARY_PATH,将依赖的动态库路径追加到这个环境变量中,可执行文件就可以执行了。在执行可执行文件时,linux 加载器会从这个环境变量所包含的路径中找动态库。

如下图所示,将 libhello.so 追加到环境变量,使用 ldd 查看 a.out 依赖的库,也不会显示 not found 了,执行 a.out 也可以正确执行。

2.2 /etc/ld.so.conf.d/

先看看这个目录下,默认有什么文件。可以看到,有 3 个 .conf 文件,文件中的内容分别是 /usr/local/lib,/lib/x86_64-linux-gnu、/usr/lib/x86_64-linux-gnu,/usr/lib/x86_64-linux-gnu/libfakeroot。这个目录下配置的路径下的动态库会被查找到。

在该目录下配置的路径下的动态库,可以通过 ldconfig -p 查看到。

如果要把本文中的 libhello.so 也加入到这个目录下,操作如下:

(1)首先在目录下增加一个 .conf 文件,文件名没有要求,只要不重复就可以,文件里写入 libhello.so 所在的目录

(2)执行 ldconfig,添加配置之后执行 ldconfig 才会生效

执行完两个步骤之后,使用 ldconfig -p 就可以看到 libhello.so 出现在缓存里了。

2.3 编译时添加路径

在编译的时候使用 -Wl,rpath  来添加动态库路径。其中 rpath 是 run path 的意思,使用 rpath 指定的路径,在加载时会到这个路径下查找动态库。

gcc main.c -lhello -L. -Wl,-rpath /home/wyl/test/libtest/

使用上边的命令编译之后,使用 ldd 查看 a.out 依赖的动态库,能够找到 libhello.so。

使用 objdump 可以看到,这个路径被直接写到了 a.out 文件中。

3 不同配置下的动态库查找顺序

LD_DEBUG 可以用来查看链接和加载过程的信息,用来调试。LD_DEBUG 可以赋不同的值,不同的值可以查看不同的调试信息。

我们使用 libs 来显示库的加载信息。在实验之前,做如下工作:

(1)编译时使用 rpath 选项

这样的话,就会将 /home/wyl/test/libtest/ 写到编译的目标文件中

gcc main.c -lhello -L. -Wl,-rpath /home/wyl/test/libtest/

(2)配置 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/wyl/test/libtest/lib1:$LD_LIBRARY_PATH

(3)配置 /etc/ld.so.conf.d/hello.conf

这样的话,3 种方式都做了配置,但是 3 个方式配置的路径是不一样的。同时我们只让 libhello.so 存在于 /home/wyl/test/libtest/lib2 中,另外两个目录下不放 libhello.so。

使用 LD_DEBUG 的打印信息如下,从打印信息可以看出来:

(1)首先查找的路径是 LD_LIBRARY_PATH 中的路径

(2)LD_LIBRARY_PATH 路径找不到,从 rpath 选项中的路径查找

(3)rpath 路径找不到,则从 /etc/ld.so.cache 中查找,该文件中保存的就是配置在 /etc/ld.so.conf.d/ 中配置的目录下的动态库

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机俄罗斯方块小游戏

基于51单片机俄罗斯方块游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用LCD12864显示游戏界面&#xff1b; 2.用四个按键控制游戏&#xff08;左、右移、下移、翻转&#xff09;&#xff1b; 3.游戏规则和平时玩的俄罗斯方块一样&a…

基于vue的音乐播放器的设计与实现(论文+源码)_kaic

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

C51学习归纳9 --- I2C通讯学习(重点)

首先&#xff0c;我自己学习过以后的直观感觉&#xff0c;通信协议是单片机的灵魂之一&#xff0c;只有规定好了通信协议我们才能够正确的接收到信息&#xff0c;才能实现更加深入的研究。所以这一部分是需要好好学习的。 本节借助一个可存储的芯片AT24C02&#xff0c;进行在I2…

C++网络编程基础

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议&#xff1a;收到数据后&#xff0c;多出来的那一部分&#xff0c;也叫一种 “约定”&#xff0c;一整套的自硬件到软件&#xff0c;都有协议&#xff0c;需要有人定制&a…

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

关于Latitude5490的问题Bios引导问题

关于Latitude5490的问题Bios引导问题 一、问题描述1、第一次维修&#xff1a;2、第二次维修&#xff1a; 二、捣鼓过程1、Latitude 5490的Bios引导2、捣鼓硬盘分区格式3、使用PE修复引导4、处理方法 三、参考链接 一、问题描述 本人原本电脑型号为Latitude 5480&#xff0c;电…

归并排序——逆序数对的统计

逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…

OPPO高级项目经理曹帆受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 OPPO互联网服务系统内容生态中心高级互联网项目经理曹帆先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“加、减、乘、除——激活项目团队效能”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议…

初中英语优秀作文分析-004My favorite Chinese traditional story-我最喜欢的中国传统故事

PDF格式公众号回复关键字:SHCZYF004 记忆树 1 There are many traditional stories in China. 翻译 中国有很多传统故事 简化记忆 传统故事 句子结构 There be句型 many traditional stories 名词短语 很多传统故事&#xff0c;in China 介词短语&#xff0c;在中国 …

Docker:利用Docker搭建一个nginx服务

文章目录 搭建一个nginx服务认识nginx服务Web服务器反向代理服务器高性能特点 安装nginx启动nginx停止nginx查找nginx镜像拉取nginx镜像&#xff0c;启动nginx站点其他方式拉取nginx镜像信息通过 DIGEST 拉取镜像 搭建一个nginx服务 首先先认识一下nginx服务&#xff1a; NGI…

【Linux】进程6——环境变量

1.什么是环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 比如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功&…

什么是档案数字化管理

档案数字化管理指的是将传统的纸质档案转换为数字形式&#xff0c;并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤&#xff1a; 1. 扫描和数字化&#xff1a;将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR&#xff08;光学字…

使用C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

Java 期末复习 习题集

&#x1f496; 单选题 &#x1f496; 填空题 &#x1f496; 判断题 &#x1f496; 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …

笔记本充电出现了问题。

不知道为什么。电池充电图片一直显示的空。谁能救救我&#xff01;

[图解]建模相关的基础知识-07

1 00:00:04,710 --> 00:00:08,900 这是划分&#xff0c;下一个是有序对的概念 2 00:00:11,720 --> 00:00:13,800 我们知道集合是不分顺序的 3 00:00:15,090 --> 00:00:18,200 我们花括号来代表集合的话 4 00:00:18,210 --> 00:00:21,000 AB花括号等于BA花括号 …

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时&#xff0c;经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库&#xff0c;但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…

aabb c++

题目描述 查找形如"aabb"的四位完全平方数&#xff0c;也即前两位数字相同&#xff0c;后两位数字也相同。 输入 无 输出 若干行&#xff0c;每行一个符合条件的四位数&#xff08;从小到大&#xff09;。 分析&#xff1a; 完全平方数&#xff1a; &#xff…

两款好用的IOS、Android图片处理应用

GIF 小助手 GIF工具包是一个简单实用的GIF动画编辑器&#xff0c;目前仅支持IOS平台。 使用该软件&#xff0c;可以将多个图像、视频和现场照片创建为gif。 主要功能&#xff1a; 多种输入源&#xff1a;用户可以将多个图片、视频或Livephoto转换成GIF动图。 编辑功能&#…

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台。通过搜索结果&#xff0c;我们可以了解到 TalkingData 的一些关键特性和市场情况&#xff0c;并将其与同类型产品进行比较。 TalkingData 产品特性 数据统计与分析&#xff1a;提供专业的数…