您的位置:首页 > 运维架构 > Linux

linux.调用dll

2017-04-29 21:21 99 查看
linux.调用dll

#include <dlfcn.h>

main()

{

 void *handle=dlopen("./libdemo4.so",RTLD_LAZY);

 void(*fun)(int)=dlsym(handle,"diamond");

 fun(5);

 dlclose(handle);}

使用libdl.so库

  动态库加载的原理            

  

  动态库中函数的查找已经封装成库libdl.so

  dlopen  打开一个动态库

  dlsym  在打开动态库找一个函数

  dlclose 关闭动态库

  //dlerror 返回错误

  译

   1.什么是动态库?(共享库)

     动态库是可以执行,静态库不能执行

     但动态库没有main,不能独立执行。

     动态库不会连接成程序的一部分。

     程序执行的时候,必须需要动态库文件。

   2.工具

     ldd  察看程序需要调用的动态库

       ldd 只能察看可执行文件.

     readelf -h 察看执行程序头.

     nm   察看库中的函数符号

   3.动态库的编译

     3.1.编译

       -c -fpic(可选)

     3.2.连接

       -shared

   4.使用动态库

     gcc 代码 动态库文件名 

     gcc 代码   -l库名 -L动态库所在路径

     

   标准命名规则:

     lib库名.so

     lib库名.a

     

     -l 库名  -L 库所在路径

       

   问题:

     4.1.执行程序怎么加载动态库?

     4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目录?

       连接器需要确定函数在动态库的中的位置

       

   动态库的加载:

     1.找到动态库

     2.加载动态库到内存

     3.映射到用户的内存空间

   系统对动态库查找规则:

     /lib

     /usr/lib

     到环境变量LD_LIBRARY_PATH指定的路径中查找

       

三.静态库的编译

  1.编译过程(*.a   achieve)

   1.1.编译成目标文件

     -static  可选

     gcc -c -static 代码文件.c

     

   1.2.归档成静态库

     ar工具

       ar -r

         -t

      ar -r 静态库文件  被归档的文件  

      

     nm工具(察看函数符号表)

      nm 静态库或者动态库或者目标文件或者执行文件

   1.3.使用静态库

     gcc 代码  静态库    

 总结:

    1.什么是库?

      函数等代码封装的二进制已经编译的归档文件

    2.ar归档工具

    3.采用库德方式管理代码优点:

      容易组织代码

      复用

      保护代码版权

    4.静态库的静态的含义:

      编译好的程序运行的时候不依赖库。

      库作为程序的一部分编译连接。

    5.静态库本质:

      就是目标文件集合(归档)

    6.-static可选

    

   2.库的规范与约定        

     库命名规则:

       lib库名.a.主版本号.副版本号.批号

       lib库名.a

     库使用规则

       -l 库名

       -L 库所在目录  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: