Linux动态链接库

27 篇文章 2 订阅

基本概念

动态链接库(Dynamic Link Library)是一个共享函数库的可执行文件,它使进程可以调用不属于本身的可执行文件以及可以调用不属于本身的可执行代码中的函数。函数的可执行代码位于一个独立的动态链接库文件中,这样可以节省内存和磁盘空间,同时使得程序更易于升级。

在这里插入图片描述

使用动态链接库的优点

动态链接库在编译的时候,在程序里面只有一个“指向”的位置而已。也就是说,动态函数库的内容并没有整合到可执行文件中,而是当可执行文件要使用到函数的机制时,程序才会去读取函数库来使用。由于可执行文件当中仅有具有指向动态链接库所在的指针而已,并不包含函数库的内容,所以它的文件会小很多。

虽然使用动态链接库编译的可执行文件无法独立运行,然而由于是具有指向的功能,所以,当函数库升级后,可执行文件根本不需要进行重新编译的行为,因为可执行文件会直接指向新的函数库文件,所以函数库的升级十分方便。

使用动态链接库的缺点

使用动态链接库编译出来的程序不能独立运行,因为当我们使用到函数库的机制时,程序才会去读取函数库,所以函数库文件必须存在才行,而且,函数库所在的目录也不能改变,因为我们的可执行文件里面仅有“指标”,即当要取用该动态函数库时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动或删除,否则会影响很多相关的程序软件。

动态链接库的编译方法

我们有so.c和so.h两个文件,要将其编译成动态链接库:

//so.h
#ifdef SO_H
#define SO_H
void function();
#endif
//so.c
#include"so.h"
#include<stdio.h>

void function(){
    printf("hello world.\n");
    return;
}
  • 先将源代码编译成.o目标文件:

  gcc -fPIC -c so.c

-fpic 参数使输出的对象模块是按照可重定位地址方式生成的。

  • 将.o目标文件编译成.so动态链接库:

  gcc -shared -o libtest.so so.o

-shared 参数指定把对应的源文件生成对应的动态链接库文件

上述两个命令也可以合并成一条命令:

  gcc so.c -fpic -shared -o libtest.so

在这里插入图片描述

  • 编写测试主程序test.c,代码如下:
//test.c
#include<stdio.h>
#include"so.h"

int main(){
    printf("This is a test function.\n");
    function();
    return 0;
}
  • 使用如下命令进行编译:

  gcc test.c -L. -ltest -o test

-L 参数指定库文件的搜索路径
-l 参数指定需要连接的库,该名称是处在前缀lib和后缀.so中的字符串

在这里插入图片描述
若运行时报错找不到动态链接库,则我们可以将.so文件复制到默认搜索目录/usr/lib下,或者可以将LD_LIBRARY_PATH环境变量修改为当前目录。

最后,我们可以通过readelf test -d命令查看可执行文件所依赖的库文件。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值