运行时动态库:not found 及介绍-linux的-Wl,-rpath命令
---此文章同步自我的CSDN博客---
一.运行时动态库:not found
今天在使用linux编写c/c++程序时,需要用到第三方的动态库文件。刚开始编译完后,运行提示找不到动态库文件.我就使用了ldd命令查看了一下,发现是有一个库文件显示"not found”,如下图所示;
对于库文件未找到,因为编译、链接都没有问题,那就是运行链接动态库时找不到动态库了。对于运行链接动态库时找不到动态库的方法,最基本的解决方法就两种:
第一种方法:找到缺少的动态库(由于编译和链接时候的使用到了这个动态库,所以很容易找得到),将其加到/lib,/usr/lib中的一个文件夹下,这几个文件夹是系统默认的搜索路径。将库文件放置在其中,运行时就可以搜索到了。
第二种方法:设置临时增加链接动态库的路径;使用
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:《your_lib_path》
比如我的libpaho-mqtt3cs.so.1在/home/mqtt/MQTT-c/lib目录下,那我使用的是:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/mqtt/MQTT-c/lib
这种方法设置的是临时的,系统重启之后就没了。当然也可以设置为持久的,这里就不过多讲述。
还有一种方法是不常用的,更改配置文件:
第三种方法:/etc/ld.so.cache中缓存了动态库路径,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变。
不过,我又想了一下,感觉这几种方法都不适合我现在的情况,这些都是事后补救的方法。首先,我不可能每次需要用到一个第三方的动态库的时候都要往几个系统默认的文件夹里面扔,这会导致这几个文件夹越来越大,越来越乱;再者,我也不想每次都设置临时动态库搜索路径,每个程序这么做的话得设置多少次啊,而且也导致文件夹变多,总归不好;而更改配置我就更不推荐了,会导致配置文件越来越乱。
我又google了一下,找到了一个命令,适合我目前的情况:指定程序运行时会在指定文件下寻找第三方的动态库。
-第四种方法:在链接时语句后面添加如下命令:
-Wl,-rpath=《my_thirdparty_lib_path》
对比一下添加前后的Makefile语句。not found时的语句:
更改之后的语句:
我们来看看更改之后的编译结果:
可以看到,我的libpaho-mqtt3cs.so.1从我在文章开头时的【not found】变成了有来源了,而绿色部分的路径就是我刚刚Makefile中的-Wl,-rpath=之后的路径。
二.介绍-Wl,-rpath=
因为今天是-Wl,-rpath解决了我的问题,而且发现网上搜到的资料不够详细,我在这里就介绍一下这个方法。
-Wl,-rpath=《your_lib_dir》是为程序添加一个运行时库文件搜索路径的命令,在使用gcc编译链接时添加即可。
其中,有两个单独的部分-Wl和-rpath组成。
-Wl
这个是gcc的参数,表示编译器将后面的参数传递给链接器ld。
请注意此处的W是大写的。
-rpath
使用man ld命令查看手册,找到了-rpath的讲解:
Add a directory to the runtime library search path. This is used when linking an ELF executable with shared objects. All -rpath arguments are concatenated and passed to the runtime linker, which uses them to locate shared objects at runtime. The -rpath option is also used when locating shared objects which are needed by shared objects explicitly included in the link; see the description of the -rpath-link option. If -rpath is not used when linking an ELF executable, the contents of the environment variable "LD_RUN_PATH" will be used if it is defined.
大体就以下这几个意思:
1. 添加一个文件夹作为运行时库的搜索路径。在将ELF可执行文件与共享对象链接时使用此选项;
2. 在链接时,一些动态库明确的链接了其他动态库, 则-rpath选项也可用于定位这些链接的动态库(没太理解这个);
3. 在运行链接时,会优先搜索-rpath的路径,再去搜索LD_RUN_PATH的路径。
至此,该命令也算是能够完成我对程序的需求了。即通过-Wl,-rpath=《lib_path》可添加文件夹作为动态库搜索路径,并记录在程序ELF可执行程序中。我们调用程序时回去我们写入的目录中查找我们的第三方库文件。
总结
后续我又查了一下,这四种方法的优先顺序:四->二->三->一。而我介绍的第四种命令是我认为在程序中应该多用的。
---来自我的CSDN博客---
运行时动态库:not found 及介绍-linux的-Wl,-rpath命令的更多相关文章
- 转: gcc 指定运行时动态库路径
gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...
- Linux 指定运行时动态库路径【转】
转自:http://www.cnblogs.com/cute/archive/2011/02/24/1963957.html 众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/l ...
- 静态库(.a)与动态库(.so)的简明介绍
静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...
- 解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?
原文地址: juejin.im/post/597856- 解决Retrofit多BaseUrl及运行时动态改变BaseUrl(一) 解决Retrofit多BaseUrl及运行时动态改变BaseUrl( ...
- LINQ to SQL 运行时动态构建查询条件
在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...
- [转] Java运行时动态生成class的方法
[From] http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编 ...
- Java 运行时动态生成class
转载 http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 Java是一门静态语言 ...
- .NET6运行时动态更新限流阈值
昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...
- [转]就这样,创建了自己的运行时共享库(RSL)
原文地址:http://riaoo.com/?p=1405 博客园的下载地址(版权归原作者) http://files.cnblogs.com/tianlanliao/CustomRSL.zip 创建 ...
随机推荐
- JAVA基础知识总结:五
一.初步认识数组 1.理解数组 数组是用来存储相兼容数据类型的定长的容器 特点: a.只能存放相兼容数据类型,不能存放多种数据类型 b.可以存放基本数据类型和引用数据类型 c.数组是定长的,一旦被初始 ...
- 从项目中总结的js知识点
1. 数字字符串和数字进行比较可以得出正确结果,却不能正确判断是否在一个数字数组中.如以下程序: var s = '8', n = 8, arr = [1,2,8,9]; console.log(s= ...
- LeetCode 205. Isomorphic Strings (同构字符串)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- 仿微信抢红包(js 转)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Leetcode题解(八)
26.Remove Duplicates from Sorted Array 题目 直接上代码,方法很简单: class Solution { public: int removeDuplicates ...
- javascript 关于 this 作用域链
使用 function f() {} 或者 var f = function() {} 来定义的函数,this 是指向 全局对象 var a = { b: 1, c: funct ...
- 图文详解linux/windows mysql忘记root密码解决方案
经常有用户过来咨询说自己的mysql服务器忘记密码了怎么办,为了更好的解决大家的困扰,本文特归档整理了windows和linux系统下,mysql忘记密码的解决方案.本文内容是我亲测实用,当然过程中踩 ...
- CSS3中的属性介绍
概念:给文字添加阴影 语法:text-shadow: length length length color 介绍:前两个参数为阴影离开文字的横方向位移距离与纵方向位移距离.使用时前两个参数必须指定,也 ...
- Docker安装Mysql数据库容器(zz)
zz自:http://blog.csdn.net/chengxuyuanyonghu/article/details/54380032 1.下载mysql的镜像: sudo docker pull m ...
- selenium页面元素操作(简易版)
介绍一下,这是处理页面元素的基本方法,@selenium 发送文字 element.send_keys(keys_to_send) 单击 element.click() 提交表单 el ...