Linux动态链接库
基本概念
动态链接库(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命令查看可执行文件所依赖的库文件。
推荐阅读
-
sql server动态存储过程按日期保存数据示例
-
在VMware虚拟机中安装redhat linux操作系统图文详解教程
-
微信小程序 动态的设置图片的高度和宽度详解及实例代码
-
ansible动态Inventory主机清单配置遇到的坑
-
在VMware虚拟机中安装Linux(Fedora16)的方法
-
python3连接mysql获取ansible动态inventory脚本
-
虚拟机中的Linux安装VMware Tools的方法
-
虚拟机VMware中安装VMware Tools for Linux的方法(Fedora16)
-
在VMware中为Linux系统安装vmware tools的详解教程
-
关于.NET动态代理的介绍和应用简介