博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux动态库搜索路径

Posted on 2012-02-13 13:54  小新786  阅读(235)  评论(0编辑  收藏  举报

Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。


例程 foo.c:

    #include<stdio.h>

    voidpos()
    {
       printf(“/projects/lib\n”);
    }

  • 编译:gcc -fPIC -c foo.c
  • 链接:gcc -shared -o libfoo.so foo.o

例程 main_foo.c:

    #include<stdlib.h>

    voidfoo();

    intmain()
    {
       foo();
       return 0;
    }

  • 编译,链接 gcc -o main_foo main_foo.c -L. -lfoo

运行: ./main_foo 出错:
./main_foo: error while loading shared libraries: libfoo.so: cannotopen shared object file: No such file or directory

 

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。

   可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。

 

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。

   通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:”分隔。

export LD_LIBRARY_PATH=/projects/lib

 

方法三:在编译目标代码时指定该程序的动态库搜索路径。

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

gcc -o main_foo main_foo.c -L. -lfoo-Wl,-rpath,/projects/lib    或者:

gcc -o main_foo main_foo.c -L. -lfoo-Wl,-rpath-link,/projects/lib

 

总结一下:Linux动态库的搜索路径搜索的先后顺序是:

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

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

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

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

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