Linux下动态共享库 连接和加载路径

1. 链接路径

连接时找不到某一个函数,出现“ xxxxx undefined”,应该就是连接时找不到相应的动态库,连接时动态库的路径如下:

1> 默认路径是:/lib,  /usr/lib/,  /usr/local/lib

2> -L: 指定连接时动态库的路径

3> LD_LIBRARY_PATH:  指定连接路径

2. 运行路径 

运行应用程序时出现“error while loading shared libraries”,则是加载时找不到相应的动态库

1> ELF可执行文件中动态段中DT_RPATH所指定的路径。这实际上是通过一种不算很常用,却比较实用的方法所设置的:编译目标代码时,可以对gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;

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

3> /etc/ld.so.cache中所缓存的动态库路径(如果支持ld.so.cache的话)。这可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径来改变;

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

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


LD_LIBRARY_PATH即使链接搜索路径也是运行搜索路径


下面的文章详细介绍了动态库的加载路径:

 http://blog.chinaunix.net/uid-27105712-id-3313327.html

http://blog.sina.com.cn/s/blog_6bf372530100o25v.html



 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径设置当中导致的。

  具体说来,动态链接器ld.so按照下面的顺序来搜索需要的动态共享库:

  1.ELF可执行文件中动态段中DT_RPATH所指定的路径。这实际上是通过一种不算很常用,却比较实用的方法所设置的:编译目标代码时,可以对gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;

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

  3./etc/ld.so.cache中所缓存的动态库路径(如果支持ld.so.cache的话)。这可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径来改变;

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

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

  在嵌入式Linux系统的实际应用中,1和2被经常使用,也有一些相对简单的的嵌入式系统会采用4或5的路径来规范动态库。3在嵌入式系统中使用的比较少,因为有很多系统根本就不支持ld.so.cache。

  4和5的方式非常简单,只要将所需要的库放到/lib或/usr/lib就可以解决找不到库的问题,不过对于大一些的系统来说,不太方便管理。1和2的方式要稍微复杂一些,下面我们用一个非常简单的例子来说明如何应用。

  首先编写一个最简单的动态共享库,源代码pirnt.c如下:

  1  #include <stdio.h>

  2

  3  void print_foo()

  4  {

  5      printf("fooooooooo\n");

  6  }

  注意将它编译成共享库&

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值