zoukankan      html  css  js  c++  java
  • dlfcn.h : Linux动态库的显式调用

    dlfcn.h : Linux动态库的显式调用[1]

    学习Linux,你可能会遇到动态库的显式调用,这里介绍动态库的显式调用的解决方法。显式调用的含义是代码出现库文件名,用户需要自己去打开和管理库文件。其要点为:

    ⑴把dlfcn.h系统头文件包含进来

    ⑵用dlopen函数打开库文件,并指定打开方式

    dllope的的第一个参数为共享库的名称,将会在下面位置查找指定的共享库。

    ①环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录。

    ②文件/etc/ld.so.cache中找到的库的列表,由ldconfig命令刷新。

    ③目录usr/lib

    ④目录/lib

    ⑤当前目录。

    第二个参数为打开共享库的方式。有两个取值

    RTLD_NOW:将共享库中的所有函数加载到内存

    RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数

    ⑶用dlerror()函数测试是否打开成功,并进行错误处理;

    ⑷用dlsym获得函数地址存放在一个函数指针中

    ⑸用获得的函数指针进行函数调用。

    ⑹程序结束时用dlclose关闭打开的动态库,防止资源泄露。

    ⑺用ldconfig工具把动态库的路径加到系统库列表中

    1、编写测试文件

    //main.c 测试动态库显式调用的程序 

    #include<dlfcn.h>  //用于动态库管理的系统头文件   

    #include "myalib.h"//要把函数的头文件包含进来,否则编译时会报错 

    int main(int argcchar* argv[]) 

    //声明对应的函数的函数指针 

    void (*pTest)(); 

    //加载动态库 

    void *pdlHandle = dlopen("libtest.so" RTLD_LAZY); 

    //错误处理 

    if(pdlHandle == NULL )

    printf("Failed load library\n"); 

    return -1; 

    char* pszErr = dlerror(); 

    if(pszErr != NULL) 

    printf("%s\n" pszErr); 

    return -1; 

    //获取函数的地址 

    pTest = dlsym(pdlHandle "test"); 

    pszErr = dlerror(); 

    if(pszErr != NULL) 

    printf("%s\n" pszErr); 

    dlclose(pdlHandle); 

    return -1; 

    //实现函数调用 

    (*pTest)(); 

    //程序结束时关闭动态库 

    dlclose(pdlHandle); 

    return 0;   

    }

    2、编译测试文件

    使用-ldl选项指明生成的对象模块需要使用共享库

    gcc -o main -ldl main.c

    执行完后就生成了一个main文件

    3、执行测试程序

    执行 ./main

    输出

    test

    说明成功。

    原文:

    http://hi.baidu.com/lzhsdly/item/2bfd52e435cde4aac00d75f0

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/mydomain/p/2712833.html
Copyright © 2011-2022 走看看