【实战】使用hiredis时怎样解决动态库找不到的问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 这个选项告诉链接器在运行时搜索动态库时也包含/usr/local/lib路径。

在使用redis 时,技术选型之后就要开始实际编程,这里我们使用hiredis 进行c++编程。


首先通过编写一个简单的demo 通过设置对应的makefile管理。先测试一下编译问题。


然后,就出现了问题:


[zryTest@master redis_test]$ ./redis_example 
./redis_example: error while loading shared libraries: libhiredis.so.1.1.1-dev: cannot open shared object file: No such file or directory


找不到这个库,查看一下服务器上到底有没有。使用find命令


sudo find / -name libhiredis.so.1.1.1-dev


有找到,说明是找不到路径。


使用 -L 命令说明查找路径。


-L/usr/local/lib


但是使用ldd 命令继续查看,显示动态库未链接


[zryTest@master redis_test]$ ldd redis_example 
        linux-vdso.so.1 =>  (0x00007ffd6d9af000)
        libhiredis.so.1.1.1-dev => not found
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f0eded69000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f0edea67000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0ede851000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0ede483000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0edf071000)


考虑动态库路径没有包含 /usr/local/lib


使用显式设定:-rpath声明路径


-Wl,-rpath=/usr/local/lib


这个选项告诉链接器在运行时搜索动态库时也包含/usr/local/lib路径。


编译通过


[zryTest@master redis_test]$ ldd redis_example 
        linux-vdso.so.1 =>  (0x00007ffe49312000)
        libhiredis.so.1.1.1-dev => /usr/local/lib/libhiredis.so.1.1.1-dev (0x00007fbc07890000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fbc07588000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fbc07286000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fbc07070000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fbc06ca2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbc07aa3000)

总结

当使用新的工具或者框架时,从git 上下载的源码编译时,make install 时,不保证存放路径能在当前操作系统路径宏中有。

所以,当发现找不到路径而实际又存在时,使用显式说明指定路径,


另外,如果你使用的是bash shell,可以将/usr/local/lib添加到LD_LIBRARY_PATH环境变量中。在命令行中执行以下命令:


export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


这将临时将/usr/local/lib添加到LD_LIBRARY_PATH环境变量中,使系统能够找到libhiredis.so.1.1.1-dev库文件。请注意,这个方法只在当前会话中有效,如果你希望永久生效,可以将这个命令添加到你的shell配置文件(如~/.bashrc)中。

目录
相关文章
|
存储 消息中间件 NoSQL
redis入门到精通系列(一):入门redis看这一篇就够了
如果你是计算机专业学生 ,那么一定使用过关系型数据库mysql。在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿甚至系统崩溃的情况。最典型的例子就是早期的12306购票网站,一旦到了购票高峰期,12306肯定崩溃。造成这个原因的罪魁祸首就是关系型数据库。
7390 0
redis入门到精通系列(一):入门redis看这一篇就够了
|
Java Linux 程序员
linux实现定时备份文件到百度网盘详细教程
作为一个程序员,数据备份尤为重要,本文主要介绍的是将服务器上的某文件定时备份到百度网盘中。主要实现思路是:安装pip、byp --> 百度网盘进行授权登陆 --> 使用crontab+bypy实现定时自动数据备份。
1505 0
|
8月前
|
Unix Linux C语言
【Linux】 Linux makefile 教程
本文详细介绍了 Linux 环境下 Makefile 的基本结构、语法和使用方法,并通过一个简单的 C++ 项目示例演示了 Makefile 的实际应用。Makefile 是一个强大而灵活的工具,通过合理配置,可以极大地简化项目的编译和管理过程,提高开发效率。希望本文能帮助您更好地理解和应用 Makefile,在实际项目中高效管理代码的编译和构建。
383 20
|
机器学习/深度学习 移动开发 自然语言处理
大模型Prompt-Tuning技术入门(二)
Prompt-Tuning是一种在大型语言模型中进行下游任务适配的技术,起源于GPT-3的In-context Learning和Demonstration Learning。它通过构建Prompt(提示)和Verbalizer(标签映射)来转换任务,比如将分类任务转化为填空问题。PET模型是Prompt-Tuning的早期实践,通过固定模板(Pattern)和标签词(Verbalizer)来实现。Prompt-Oriented Fine-Tuning是Prompt-Tuning的一种形式,将任务转换为与预训练任务相似的形式,如BERT的MLM任务。
|
传感器 开发工具 vr&ar
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
|
监控 网络协议 Linux
振南技术干货集:各大平台串口调试软件大赏(7)
振南技术干货集:各大平台串口调试软件大赏(7)
|
Docker 容器
Docker Desktop镜像迁移到其他磁盘
Docker Desktop镜像迁移到其他磁盘
426 0
|
Ubuntu Linux 开发工具
ZYNQ - 嵌入式Linux开发 -08- linux应用程序开发(一)
ZYNQ - 嵌入式Linux开发 -08- linux应用程序开发
858 0
ZYNQ - 嵌入式Linux开发 -08- linux应用程序开发(一)
|
Ubuntu Shell Linux
ZYNQ - 嵌入式Linux开发 -04- petalinux和Xilinx_SDK2018.3安装(二)
ZYNQ - 嵌入式Linux开发 -04- petalinux和Xilinx_SDK2018.3安装
1530 0
ZYNQ - 嵌入式Linux开发 -04- petalinux和Xilinx_SDK2018.3安装(二)
《QT从基础到进阶·十》QTableView,QTableWidget,QLineEdit设置只读和输入限制
《QT从基础到进阶·十》QTableView,QTableWidget,QLineEdit设置只读和输入限制
670 0