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的路径,包括“”和<>两种路径。可以将库拷贝到相关的路径
网友评论