• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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)
    程序执行结果如下所示:

    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

    您可能感兴趣的文章:
    • Python在Windows和在Linux下调用动态链接库的教程
    • Linux静态链接库与模板类的处理方式
    • Linux静态链接库使用类模板的快速排序算法
    • Linux下动态链接库加载路径及搜索路径问题
    上一篇:使用scp获取远程linux服务器上的文件 linux远程拷贝文件
    下一篇:程序中获取linux系统启动时间方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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