Linux下指定so动态库的加载路径的5种方法!!!

 -Wl,-rpath=linux中真实运行的路径

重点:编译时两个路径 (一个是编译用到的库的路径,另外一个是linux真实运行环境时用到的路径)如何编译?

              不要用绝对路径,编译用到的库的路径比如是/output/mt_ls2k1000/lib/文件夹下的,则可以按照下面(1)的方式加载进来,而真实环境用到的路径则采用(2)的方式加载进来,

            这样编译时$(CC) -o $(PROGRAM) $(filter %.o ,$+) -L$(OUTPUT_LIB_DIR) $(APP1_LIB) ,一个编译时用到的路径和真实运行的路径都加载进来了。

(1)定义链接库,格式: -L[libpath]

       需要理解:-L 是指此文件夹里面的库都默认会查询到。比如有两个库 lib1.so  lib2.so存在/output/mt_ls2k1000/lib里面

 则  OUTPUT_LIB_DIR=/output/mt_ls2k1000/lib

编译时需要  -L$(OUTPUT_LIB_DIR)   就可以找到此文件夹里面的,就可以调用到里面的库lib1.so  lib2.so。

注意:-L后面是库的路径

(2) -lxxx [libxxx.so libxxx.a]

APP1_LIB            := -Wl,--start-group
#应用组件库
APP1_LIB            += -ldlt69845datatransfor
APP1_LIB            += -lcommonfunc2
APP1_LIB            += -lmtmsg
APP1_LIB            += -lpaho-mqtt3c
APP1_LIB            += -Wl,--end-group
APP1_LIB            += -Wl,-rpath=$(strip /media/dc/mt_tmnl698/lib_zt)

编译时需要 $(APP1_LIB)  就可以找到里面的libdlt69845datatransfor.so、libcommonfunc2.so等等。

注意:-l后面是具体的库

(3)注意:-Wl,-rpath=$(strip /media/dc/mt_tmnl698/lib_zt)    

   -Wl,-rpath=linux中真实运行的路径,这样自己设定路径,是最佳的动态库加载路径的方式。大于下面1 2 4 5四种搜索路径的方式.

其中strip的意思:正常情况下编译出来的共享库和可执行文件中都带有符号信息和调试信息,但是发布版本一般不需要这些信息。且这些信息会导致可执行文件大一倍多,所以可以使用strip命令去掉调试信息:strip liba.so

一、库文件的搜索路径:

1、在配置文件/etc/ld.so.conf中指定动态库搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig

假设MySQL数据库函数库在 /usr/lib/mysql中,如何读入高速缓存?

[root@linux ~]# vi /etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/lib/mysql   <==这一行是新增的。

[root@linux ~]# ldconfig

# 画面上不会显示任何信息,正常。

[root@linux ~]# ldconfig -p

928 libs found in cache `/etc/ld.so.cache'

        libz.so.1 (libc6) => /usr/lib/libz.so.1

        libz.so (libc6) => /usr/lib/libz.so

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

设置临时增加链接动态库的路径;使用

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

  在博客的另外一篇文章有具体介绍

3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。 这是通过gcc 的参数"-Wl,-rpath,"指定,当指定多个动态库搜索路径时,路径之间用冒号":"分隔)

      见上

4、默认的动态库搜索路径/lib

5、默认的动态库搜索路径/usr/lib

    找到缺少的动态库(由于编译和链接时候的使用到了这个动态库,所以很容易找得到),将其加到/lib,/usr/lib中的一个文件夹  下,这几个文件夹是系统默认的搜索路径。将库文件放置在其中,运行时就可以搜索到了。

搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

二、Shell可执行程序命令文件搜索路径:

1.查看所有的搜索路径:echo $PATH

2.添加新的路径:

1)只对当前shell窗口有效:

export PATH=$PATH:/new path

2)对所有窗口有效:

修改当前用户的.bash_profile文件,在PATH=$PATH……后添加":/new path";

保存退出后,需要在当前窗口中执行". .bash_profile",更新配置,之后用echo $PATH显示更新后的路径,可以看到新加入的路径;

注意:在重新登录前所有新打开的shell窗口要用到新的路径都需要执行". .bash_profile",更新配置,因为.bash_profile文件的内容在用户登录时就读取了.

原文地址:https://www.cnblogs.com/lidabo/p/15568234.html