---此文章同步自我的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命令的更多相关文章

  1. 转: gcc 指定运行时动态库路径

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

  2. Linux 指定运行时动态库路径【转】

    转自:http://www.cnblogs.com/cute/archive/2011/02/24/1963957.html 众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/l ...

  3. 静态库(.a)与动态库(.so)的简明介绍

    静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...

  4. 解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?

    原文地址: juejin.im/post/597856- 解决Retrofit多BaseUrl及运行时动态改变BaseUrl(一) 解决Retrofit多BaseUrl及运行时动态改变BaseUrl( ...

  5. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

  6. [转] Java运行时动态生成class的方法

    [From] http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编 ...

  7. Java 运行时动态生成class

    转载 http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 Java是一门静态语言 ...

  8. .NET6运行时动态更新限流阈值

    昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...

  9. [转]就这样,创建了自己的运行时共享库(RSL)

    原文地址:http://riaoo.com/?p=1405 博客园的下载地址(版权归原作者) http://files.cnblogs.com/tianlanliao/CustomRSL.zip 创建 ...

随机推荐

  1. (MariaDB)MySQL内置函数大全

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  2. typeof、constructor和instance

    在JavaScript中,我们经常使用typeof来判断一个变量的类型,使用格式为:typeof(data)或typeof data.typeof返回的数据类型有六种:number.string.bo ...

  3. 顺序线性表 ---- ArrayList 源码解析及实现原理分析

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...

  4. 点击下拉,其余不动的jquery事件(转)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. C#设计模式--简单工厂模式

    简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一. 举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门.客户相当于上端,不同部门相当于下端.不使用简单工厂模式来实现的例子如 ...

  6. 基于Spring、SpringMVC、MyBatis、Druid、Shrio构建web系统

    源码下载地址:https://github.com/shuaijunlan/Autumn-Framework 在线Demo:http://autumn.shuaijunlan.cn 项目介绍 Autu ...

  7. Leetcode题解(十七)

    48.Rotate Image 题目: 分析:题目意思很简单,就是将一个n*n的矩阵顺时针旋转90度. 这道题难度不大,按照旋转的过程走一遍即可.代码如下: class Solution { publ ...

  8. A - 棋盘问题 POJ - 1321

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  9. Android 开发笔记___Activity的生命周期

    一个activity就是一个页面,入口函数是oncreate(). onCreate:创建页面,把页面上各个元素加载到内存 onStart:开始页面,把页面显示在屏幕 onResume:恢复页面,让页 ...

  10. VUE插件-图片濑加载

    1.  cnpm install vue-lazyload 2.main.js import  vue-lazyload from  'vue-lazyload' Vue.use(vue-lazylo ...