红联Linux门户
Linux帮助

Linux动态库搜索路径优先级问题 第二个人的理解

发布时间:2008-05-05 21:09:39来源:红联作者:zisxvdmc
作者:annight E-mail:annightzhao@gmail.com

5月5日
今天学习LINUX的动态库的搜索优先级

当运行GCC,将先把程序经过编译器生成 .o文件,该文件不能直接运行,需再次生成可执行文件,才可被系统运行。如果程序中涉及到调用库函数时候,这时候就分调用静态库(.o)和调用动态库(.so)两种情况了,一般来说静态库可直接调用,调用方便,但需要调用库文件的函数都要调用一个库函数,这就使该程序占用大量内存空间(如果该程序有很多函数需要调用库函数),而动态库需要指定路径(系统运行程序时将会搜索库函数),但所有需要调用库的函数这时共用一个库函数。

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

今天学习动态库有几种指定路径(几种搜索方式),了解他们之间的优先级,具体方法是将4个不同文件库指定不同路径,他们共同被一个程序调用,由于搜索的优先级别将会调用不同的库函数。

LINUX的动态库一般有4种搜索方式(按优先级高--->低):

我们先建立几个文件:
1.接口:tlib.h
#ifndef __tlib_h
#define __tlib_h

void test(void);

#endif

2.tlib.c
#include "tlib.h"
#include

void test()
{
printf("This is test(1,2,3,4)\n");

}

3.执行程序:test.c
#include
#include "tlib.h"

int main()
{
test();
return 0;
}

1.通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。具体方法如下:
gcc -fPIC -wall -g -c tlib.c
gcc -shared -fPIC -o libtlib.so tlib.o(注意生成的动态库函数必须是lib打头)
gcc -o test test.c -L. -ltlib (L参数是指动态库存放地 .是指当前路径下;l参数是表示动态库名字,这里的tlib 是将libtlib的前头lib去掉)
export LD_LIBRARY_PATH=/~(~是指你存放.h文件的路径)

2.在配置文件/etc/ld.so.conf中指定动态库搜索路径。
gcc -fPIC -wall -g -c tlib.c
gcc -shared -fPIC -o libtlib.so tlib.o
gcc -o test test2.c -L. -ltlib

打开/etc/ld.so.conf 文件并将你存放.h文件的路径加入。Ldconfig (是将你修改的配置文件保存导入)

3.将动态库放入/lib中
gcc -fPIC -wall -g -c tlib.c
gcc -shared -fPIC -o libtlib.so tlib.o
gcc -o test test3.c -L. -ltlib
mv libtlib.so /lib

4. 将动态库放入/usr/lib中
gcc -fPIC -wall -g -c tlib.c
gcc -shared -fPIC -o libtlib.so tlib.o
gcc -o test test4.c -L. -ltlib

mv libtlib.so /usr/lib

最后运行test文件将得出test1, 为了测试,第二步将全局变量取消,然后运行test文件将得出test2,依次类推,大家自己想想

有些想法可能不对,请大家多指教
文章评论

共有 0 条评论