动态库的制作和使用

2019-05-27  本文已影响0人  54c1eca7148a

1、动态库的命名方式

    动态库命名:lib+库名.so。如libtmath.so

2、动态库的制作和使用

(1)将需要添加到动态库的源文件编译为与位置无关的目标文件(与位置无关是指:

使用nm 命令查看静态库二进制文件、目标文件时,出现:

。。。

080383e4 T add

08038335 T sub

08038328 T mul

08038316 T div

。。。

每行前面有一个地址,表示执行起始位置为固定位置,动态库制作中就要试它每次执行位置不固定。使得可执行程序在加载时才从依赖的库文件中找到相应函数,加载到内存,但是加载到内存的位置时不确定的,这就叫与位置无关。

(2)将目标文件添加到动态库中

(3)使用动态库链接目标文件,生成可执行文件

例:以静态库制作同例

2、动态库的制作和使用(为方便观察现将原来目标文件和库文件删除)

(1)将需要添加到动态库的源文件编译为与位置无关的目标文件

    gcc -c -fPIC *.c

    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对  地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

(2)将目标文件添加到动态库中

    gcc -shared -o libtmath.so *.o

    shared选项:指定生成动态库文件

(3)使用动态库链接目标文件,生成可执行文件

    gcc tt1.c -Ltmath -ltmath -o tt

-L和-l选项说明见静态库制作与使用的笔记末尾链接,注意此时还不能执行可执行程序,因为还需要指定加载器加载路径,使用ldd命令可以查看可执行程序依赖的动态库文件。

a.可以使用环境变量LD_LIBRARY_PATH来指定加载器的寻找路径。即指定动态库文件的路径

b.加载有默认的加载路径,可以讲动态库文件拷贝到相关位置。

3、动态库和静态库共存时默认采用动态链接,如需采用静态链接,需使用-static选项来进行指定。

4、使用-v选项可以查看到include的路径,包括“”和<>两种路径。可以将库拷贝到相关的路径

上一篇下一篇

猜你喜欢

热点阅读