没有合适的资源?快使用搜索试试~ 我知道了~
linux静态链接库与动态链接库的区别及动态库的创建.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 167 浏览量
2021-11-17
23:06:04
上传
评论
收藏 39KB PDF 举报
温馨提示
试读
19页
linux静态链接库与动态链接库的区别及动态库的创建.pdf
资源推荐
资源详情
资源评论
linux 静态链接库与动态链接库的区别及动态库的创建
一、引言
通常情况下, 对函数库的链接是放在编译时期 (compile time )完成的。 所有相关的对象文件 (object
file)与牵涉到的函数库( library )被链接合成一个可执行文件( executable file )。程序在运行时,
与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库( static
libaray ),通常文件名为 “libxxx.a ”的形式。
其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期( runtime )。这就是如雷贯耳
的动态链接库( dynamic link library )技术。
二、动态链接库的特点与优势
首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:
1. 可以实现进程之间的资源共享。
什么概念呢?就是说, 某个程序的在运行中要调用某个动态链接库函数的时候, 操作系统首先会查看
所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只
有没有才链接载入。这样的模式虽然会带来一些 “动态链接 ”额外的开销,却大大的节省了系统的内存
资源。C 的标准库就是动态链接库, 也就是说系统中所有运行的程序共享着同一个 C 标准库的代码段。
2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就
可以完成整个程序的升级。 Windows 就是一个很好的例子。
3. 甚至可以真正坐到链接载入完全由程序员在程序代码中控制。
程序员在编写程序的时候, 可以明确的指明什么时候或者什么情况下, 链接载入哪个动态链接库函数。
你可以有一个相当大的软件, 但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内
存。所有的函数本着 “有需求才调入 ”的原则,于是大大节省了系统资源。比如现在的软件通常都能打
开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中, 一般只有一
种类型的文件将会被打开。 所以直到程序知道文件的类型以后再载入相应的读写函数, 而不是一开始
就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。
三、动态链接库的创建
由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。 在编译的时候,编译器只会做一
些函数名之类的检查。 在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方, 所有
调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。 在编译的时
候,我们需要告诉编译器, 这些对象文件是用来做动态链接库的, 所以要用地址不无关代码 (Position
Independent Code (PIC ))。
对 gcc 编译器,只需添加上 -fPIC 标签,如:
gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc -shared libxxx.so file1.o file2.o
注意到最后一行, -shared 标签告诉编译器这是要建立动态链接库。 这与静态链接库的建立很不一样,
后者用的是 ar 命令。也注意到,动态链接库的名字形式为 “libxxx.so ” 后缀名为 “.so ”
四、动态链接库的使用
使用动态链接库,首先需要在编译期间让编译器检查一些语法与定义。
这与静态库的实用基本一样,用的是 -Lpath 和 -lxxx 标签。如:
gcc file1.o file2.o -Lpath -lxxx -o program.exe
编译器会先在 path 文件夹下搜索 libxxx.so 文件,如果没有找到,继续搜索 libxxx.a (静态库)。
在程序运行期间,也需要告诉系统去哪里找你的动态链接库文件。在 UNIX 下是通过定义名为
LD_LIBRARY_PATH 的环境变量来实现的。只需将 path 赋值给此变量即可。 csh 命令为:
setenv LD_LIBRARY_PATH your/full/path/to/dll
一切安排妥当后,你可以用 ldd 命令检查是否连接正常。
ldd program.exe
编译参数解析
最主要的是 GCC 命令行的一个选项 :
-shared 该选项指定生成动态连接库(让连接器生成 T 类型的导出符号表,有时候也生成弱连接 W
类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC :表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是
通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l -L. :表示要连接的库在当前目录中
l -ltest :编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上 lib,后面加上 .so 来
确定库的名称
l LD_LIBRARY_PATH :这个环境变量指示动态连接器可以装载动态库的路径。
l 当然如果有 root 权限的话, 可以修改 /etc/ld.so.conf 文件,然后调用 /sbin/ldconfig 来达到同样的目
的,不过如果没有 root 权限,那么只能采用输出 LD_LIBRARY_PATH 的方法了。
4、注意
调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I ” include
进来了,库所在文件通过 “-L”参数引导,并指定了 “-l ”的库名,但通过 ldd 命令察看时,就是死活找不
到你指定链接的 so 文件,这时你要作的就是通过修改 LD_LIBRARY_PATH 或者 /etc/ld.so.conf 文件
来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
五、静态库的创建和使用:
1、生成静态库 :库名 libmylib.a
ar rcs libmylib.a mylib.o
2、将静态库 copy 到 /usr/lib/ 或/lib/ 目录下
cp libmylib.a /usr/lib/
3、静态库的使用
比如测试文件为 test.c
gcc -0 test test.c -lmylib
-l 为选项, mylib 为库名。 mylib 为 libmylib 的中间部分, Linux 下约定所有库都以前缀 lib 开始
静态库以 .a 结尾,动态库以 .so 结尾。再编译程式时,无需带上前缀和后缀。
注意:静态库的命名需要以 "lib"开头,否者连接是编译器无法找到库
大家都知道, 在 WINDOWS系统中有很多的动态链接库 ( 以.DLL 为后缀的文件, DLL即 Dynamic
Link Library) 。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身
的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个 执行程序间共享,
节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。那么,
在 LINUX 系统中有无这样的函数库呢?
答 案是肯定的, LINUX的动态链接库不仅有,而且为数不少。在 /lib 目录下,就有许
多以 .so 作后缀的文件,这就是 LINUX 系统应用的动态链接库,只 不过与 WINDOWS叫法不
同,它叫 so,即 Shared Object ,共享对象。 ( 在 LINUX 下,静态函数库是以 .a 作后缀的 )
X-WINDOW作为 LINUX 下的标准图形窗口界面,它本身就采用了很多的动态链接库 ( 在
/usr/X11R6/lib 目录下 ) ,以方便程序间的共享, 节省占用空间。着名的 APACHE网页 服务
器,也采用了动态链接库,以便扩充程序功能。你只需将 PHP动态链接库拷到其共享目录,
修改一下配置, APACHE就可以支持 PHP网页了。如果你愿意,可以自己编写动态链接库,
让 APACHE支持你自己定义的网页格式。这就是动态链接的好处。
1、LINUX 下动态链接库的创建
在 LINUX 系统下, 创建动态链接库是件再简单不过的事情。 只要在编译函数库源程序时
加上 -shared 选项即可,这样所生成的执行程序即为动态链接库。从某种意义上来说,动态
链接库也是一种执行程序。按一般规则,程序名应带 .so 后缀。下面举个例子说说。
我准备编写两个函数,一个用于查询当前日期 getdate ,一个用于查询当前时间
gettime ,并将这两个函数存于动态链接库 my.so 中。为此,需要做以下几项工作。
1.1 编写用户接口文件 datetime.h ,内容如下 ( 每行前面的数字为行号 ) :
----------------------------------------------------------------------
1 /* datetime.h : 纵横软件制作中心雨亦奇编写 , 2001-06-28. */
2
3 #ifndef __DATETIME_H
4
5 #define __DATETIME_H
6
7 /* 日期结构 */
8 typedef struct
9 {
剩余18页未读,继续阅读
资源评论
BlueWatergg
- 粉丝: 3
- 资源: 11万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功