服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - linux动态链接库使用方法分享

linux动态链接库使用方法分享

2022-12-26 13:44linux教程网 Linux

这篇文章主要介绍了linux动态链接库使用方法,大家参考使用吧

1、前言

在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中讲到程序的链接和装入过程,这些玩意都是底层的,对于理解程序的编译过程有好处。http://www.ibm.com/developerworks/cn/linux/l-dynlink/博文介绍了程序的链接和装入过程。本文重点在于应用,如何编写和使用动态链接库,后续使用动态链接库实现一个插件程序。

2、动态链接库生产

动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

程序代码如下:

 

复制代码 代码如下:

/*caculate.h*/

 

#ifndef CACULATE_HEAD_
#define CACULATE_HEAD_
//加法
int add(int a, int b);
//减法
int sub(int a, int b);
//除法
int div(int a, int b);
//乘法
int mul(int a, int b);

#endif

/*caculate.c文件*/
#include "caculate.h"

//求两个数的和
int add(int a, int b)
{
    return (a + b);
}
//减法
int sub(int a, int b)
{
    return (a - b);
}
//除法
int div(int a, int b)
{
    return (int)(a / b);
}
//乘法
int mul(int a, int b)
{
    return (a * b);
}

 

编译生产libcac.so文件如下: gcc -shared -fPIC caculate.c -o libcac.so
编写一个测试程序调用此动态链接库的函数,程序如下所示:

 

复制代码 代码如下:

#include <stdio.h>
#include "caculate.h"

 

int main()
{
    int a = 20;
    int b = 10;
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d - %d = %d\n", a, b, sub(a, b));
    printf("%d / %d = %d\n", a, b, div(a, b));
    printf("%d * %d = %d\n", a, b, mul(a, b));
    return 0;
}

 

编译生产可执行文件main如下:gcc main.c -o main -L ./ -lcac   (其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib)
程序执行结果如下所示:

linux动态链接库使用方法分享

3、获取动态链接库的函数
linux提供dlopen、dlsym、dlerror和dlcolose函数获取动态链接库的函数。通过这个四个函数可以实现一个插件程序,方便程序的扩展和维护。函数格式如下所示:

 

复制代码 代码如下:

#include <dlfcn.h>

 

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

 Link with -ldl.
 

 

dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。写个测试程序调用上面生产libcac.so库如下所示:

 

复制代码 代码如下:

#include <stdio.h>
#include <dlfcn.h>

 

#define DLL_FILE_NAME "libcac.so"

int main()
{
    void *handle;
    int (*func)(int, int);
    char *error;
    int a = 30;
    int b = 5;

    handle = dlopen(DLL_FILE_NAME, RTLD_NOW);
    if (handle == NULL)
    {
    fprintf(stderr, "Failed to open libaray %s error:%s\n", DLL_FILE_NAME, dlerror());
    return -1;
    }

    func = dlsym(handle, "add");
    printf("%d + %d = %d\n", a, b, func(a, b));

    func = dlsym(handle, "sub");
    printf("%d + %d = %d\n", a, b, func(a, b));

    func = dlsym(handle, "div");
    printf("%d + %d = %d\n", a, b, func(a, b));

    func = dlsym(handle, "mul");
    printf("%d + %d = %d\n", a, b, func(a, b));

    dlclose(handle);
    return 0;
}

 

程序执行结果如下所示:gcc call_main.c -o call_main -ldl

linux动态链接库使用方法分享

延伸 · 阅读

精彩推荐
  • Linux在linux服务器上安装Jenkins

    在linux服务器上安装Jenkins

    Jenkins是用java编写的开源持续集成工具,目前被国内外各公司广泛使用。本章教大家如何在linux服务器上安装Jenkins。...

    低调的微胖10392022-01-19
  • LinuxLinux下安装VMware Tools 的方法

    Linux下安装VMware Tools 的方法

    VMware安装完成后, VMware Tools 默认是没有安装的,启动Linux后,在VMware 的状态栏提示WMware Tools is not installed on this guest ...

    Linux教程网2602019-11-06
  • LinuxLinux下删除文件之彻底删除文件(shred)

    Linux下删除文件之彻底删除文件(shred)

    在linux中删除文件与文件夹我们可以直接使用rm就可以删除了,彻底删除文件或文件夹我们可以使用shred命令来完成,下面我给大家介绍介绍 ...

    Linux教程网11642019-11-11
  • LinuxLinux如何实现断点续传文件功能

    Linux如何实现断点续传文件功能

    最近在工作中遇到一个需求,要实现Linux下的文件传输,支持断点续传,所以这篇文章主要给大家介绍了关于Linux如何实现断点续传文件功能的相关资料,文...

    dounine9612022-02-23
  • LinuxLinux colrm命令用法和使用实例

    Linux colrm命令用法和使用实例

    这篇文章主要介绍了Linux colrm命令用法和使用实例,本文讲解了colrm命令的语法和使用示例,需要的朋友可以参考下 ...

    Linux教程网5532019-09-29
  • Linuxlinux wc命令参数及用法详解

    linux wc命令参数及用法详解

    wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出...

    未知15942019-05-20
  • Linuxlinux下php加装mssql模块的方法

    linux下php加装mssql模块的方法

    在linux 下的php连接mssql,就需要安装第三方的freetds了。需要的朋友可以参考下。...

    Linux教程网6482021-03-28
  • Linuxlinux系统中如何查看日志

    linux系统中如何查看日志

    内部总是发现有病毒和恶意的攻击,我想请问如何查看日志 如何查看日志 [quote][i]原帖由 yanggang209]内部总是发现有病毒和恶意的攻击,我想请问如何查看日...

    Linux教程网4382020-04-19