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

本文涉及的产品
云数据库 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)中。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4天前
|
算法 程序员 编译器
【cmake 踩坑记录】CMake文件安装深入解析:EXCLUDE的奥秘与替代方案
【cmake 踩坑记录】CMake文件安装深入解析:EXCLUDE的奥秘与替代方案
50 0
|
4天前
|
编译器 程序员 C语言
静态库与动态库的构建(含具体代码可以实操)
静态库与动态库的构建(含具体代码可以实操)
13 0
|
6月前
|
存储 编译器 C++
《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数
《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数
129 0
|
9月前
|
存储 前端开发 关系型数据库
前端项目实战拾伍-由于找不到LIBPQ.dll,无法继续执行代码
前端项目实战拾伍-由于找不到LIBPQ.dll,无法继续执行代码
76 0
|
12月前
|
Linux 编译器 C语言
gcc后续——链接时的静态库和动态库
gcc后续——链接时的静态库和动态库
110 0
|
存储 Linux 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
216 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
|
Linux Shell 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
282 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
|
Linux
LINUX编译时缺少头文件,查找依赖库的终极解决办法
LINUX编译时缺少头文件,查找依赖库的终极解决办法
330 0
|
Java Linux Shell
jemalloc编译出错?没事,这里有成功的linux环境的编译及使用方案(★firecat推荐★)
jemalloc编译出错?没事,这里有成功的linux环境的编译及使用方案(★firecat推荐★)
691 0