欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux动态链接库

程序员文章站 2022-05-12 23:39:59
...

基本概念

动态链接库(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

Linux动态链接库

  • 编写测试主程序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中的字符串

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

最后,我们可以通过readelf test -d命令查看可执行文件所依赖的库文件。
Linux动态链接库

相关标签: Linux C++